[C/C++] Initialiser la taille d'un tableau, membre d'une classe mère

Le côté programmation du développement d'un jeu vidéo.

Initialiser la taille d'un tableau, membre d'une classe mère

Messagepar Nieluj » 14 Sep 2011, 17:16

Bonjour,

J'ai à nouveau une question qui concerne l'objet en c++.

J'ai un tableau à 2 dimensions contenu dans une classe mère mais j'aimerai qu'il ai une taille différente selon la classe fille. De plus, la classe mère doit avoir accès au tableau ( ce qui n'est pas possible si la solution consiste à virer le tableau de cette classe ).

J'ai d'abord tenté avec un vecteur que je redimensionne dans le constructeur des classes filles avec resize(). Mais pour certaines raisons ça bug... Je me suis alors demandé s'il n'était pas possible et plus simple de déclarer le tableau en virtuel ( mais j'ai cru comprendre que ce n'était pas possible en c++ ).

Qu'en pensez-vous ?

Julien.
Avatar de l’utilisateur
Nieluj
Hello World, I'm new !
 
Messages: 110
Inscription: 27 Oct 2009, 14:11

Messagepar valentin » 14 Sep 2011, 17:42

Code: Tout sélectionner

//mother.h

class mother{
public:

    int **   tab;
    int        n, m;

    mother(int n, int m); 
    ~mother();
};

//mother.cpp

mother::mother(int n, int m)
{
    tab = new int*[n];
    for(int i = 0; i < n; ++i)
    {
        tab[i] = new int[m];
    }
}

mother::~mother()
{
    for(int i = 0; i < n; ++i)
    {
        delete[] tab[i];
    }
    delete[] tab;
}

//child.h

class child:public mother
{
public:
    child();
}

//child.cpp

child::child():mother(5, 6)
{
}


Pas testé mais bon je pense que t'as compris le principe
Avatar de l’utilisateur
valentin
Hello World, I'm new !
 
Messages: 494
Inscription: 20 Mai 2008, 16:10
Localisation: GRENOBLE

Messagepar Nieluj » 14 Sep 2011, 17:54

Bah oui ... Non mais c'était vraiment con comme question, j'ai voulu me compliquer les choses pour rien là :00000012:

Merci.
Avatar de l’utilisateur
Nieluj
Hello World, I'm new !
 
Messages: 110
Inscription: 27 Oct 2009, 14:11

Messagepar Nieluj » 14 Sep 2011, 18:12

Sinon, il y a une raison pour laquelle tu ne fais pas l'allocation dynamique directement dans le constructeur de child ?
Avatar de l’utilisateur
Nieluj
Hello World, I'm new !
 
Messages: 110
Inscription: 27 Oct 2009, 14:11

Messagepar valentin » 14 Sep 2011, 21:42

Elle est faite dans le constructeur de la class mother. ça t'évite de multiplier des lignes de code si tu fais plusieurs class fille.
En plus pas besoin de gérer la désallocation vu qu'elle est faite dans le destructeur de la class mother.
Avatar de l’utilisateur
valentin
Hello World, I'm new !
 
Messages: 494
Inscription: 20 Mai 2008, 16:10
Localisation: GRENOBLE

Messagepar Gabriel » 14 Sep 2011, 21:49

des raisons sur le fait de ne pas utiliser std::vector ?
Avatar de l’utilisateur
Gabriel
 
Messages: 311
Inscription: 25 Fév 2006, 10:15

Messagepar teto » 15 Sep 2011, 10:27

Après avoir fait un resize, tu dois faire des push_back autrement ca va planter.

Si ta classe mère est une interface (non instanciable), tu peux déclarer une méthode virtuelle pure "virtual TypeDeRetour valeurAlindex(const std::size_t& index) = 0"; que tu définiras dans les classes filles selon leur manière de gérer le tableau.
Avatar de l’utilisateur
teto
 
Messages: 1168
Inscription: 26 Juil 2005, 19:02
Localisation: /home/Paris

Messagepar valentin » 15 Sep 2011, 11:31

@ Gabriel: Il n'a pas parlé de redimmensionnement après initialisation, pas besoin de std::vector si c'est pour ne pas utiliser ses avantages.
On ne connait pas ses besoins, j'ai juste répondu à la question.
Avatar de l’utilisateur
valentin
Hello World, I'm new !
 
Messages: 494
Inscription: 20 Mai 2008, 16:10
Localisation: GRENOBLE

Messagepar Nieluj » 15 Sep 2011, 11:43

En effet, vector serait inutile pour ce cas. J'étais juste parti sur cette solution à cause de la fatigue surement :00000023:
Avatar de l’utilisateur
Nieluj
Hello World, I'm new !
 
Messages: 110
Inscription: 27 Oct 2009, 14:11

Messagepar Gabriel » 15 Sep 2011, 15:30

@ Gabriel: Il n'a pas parlé de redimmensionnement après initialisation, pas besoin de std::vector si c'est pour ne pas utiliser ses avantages.
On ne connait pas ses besoins, j'ai juste répondu à la question.
En effet, vector serait inutile pour ce cas. J'étais juste parti sur cette solution à cause de la fatigue surement
Il code en C++ non ? donc redimmensionnement ou pas, std::vector devrait être utilisé, sinon je vois pas l'intérêt de coder en C++ si c'est pour faire du C-Like ...
En terme de performance, c'est *exactement* pareil pour les opérations standard que ce soit C-Like ou C++. Je ne vois pas l'intérêt d'éviter d'utiliser la bibliothèque standard, elle a été fait pour être utilisée.
Je m'étendrai pas sur le reste du code (il y aurait de quoi parler aussi), mais évitez de mélanger C et C++.
Avatar de l’utilisateur
Gabriel
 
Messages: 311
Inscription: 25 Fév 2006, 10:15

Messagepar valentin » 15 Sep 2011, 15:37

mais évitez de mélanger C et C++.


Entièrement d'accord, mais ce n'est pas le cas.
Avatar de l’utilisateur
valentin
Hello World, I'm new !
 
Messages: 494
Inscription: 20 Mai 2008, 16:10
Localisation: GRENOBLE

Messagepar Aranoth » 15 Sep 2011, 16:53

Gabriel a écrit:Il code en C++ non ? donc redimmensionnement ou pas, std::vector devrait être utilisé, sinon je vois pas l'intérêt de coder en C++ si c'est pour faire du C-Like ...
En terme de performance, c'est *exactement* pareil pour les opérations standard que ce soit C-Like ou C++. Je ne vois pas l'intérêt d'éviter d'utiliser la bibliothèque standard, elle a été fait pour être utilisée.
Je m'étendrai pas sur le reste du code (il y aurait de quoi parler aussi), mais évitez de mélanger C et C++.
Aux dernières nouvelles les tableaux font toujours partie intégrante du standard C++...

Je ne vois pas en quoi std::vector devrait être utilisé comme tu dis... s'il a besoin d'un tableau il utilise un tableau, pas un vector !
Avatar de l’utilisateur
Aranoth
Hello World, I'm new !
 
Messages: 1327
Inscription: 10 Avr 2005, 00:10
Localisation: Montréal

Messagepar remram44 » 15 Sep 2011, 17:00

Par contre, vector ou pas, je préconise l'utilisation d'un tableau 1D, vu que toutes les lignes ont la même taille...

Code: Tout sélectionner
//mother.h

class mother {

private:
    int *tab;
    int n, m;

    mother(int n, int m); 
    ~mother();

    int &elementAt(int x, int y);

};

//mother.cpp

mother::mother(int n, int m)
{
    tab = new int[n*m];
}

mother::~mother()
{
    delete[] tab;
}

int &mother::elementAt(int x, int y)
{
    assert(x < n);
    assert(y < m);
    return tab[y*n+x];
}


Bien sûr vous faites comme vous voulez.
Cordialement, remram44.
Avatar de l’utilisateur
remram44
Hello World, I'm new !
 
Messages: 687
Inscription: 27 Juil 2005, 16:18
Localisation: New York City, NY, USA

Messagepar Gabriel » 15 Sep 2011, 17:09

Bon, j'éviterai d'en rajouter une couche après, car ça va être un débat sans fin :

Aux dernières nouvelles les tableaux font toujours partie intégrante du standard C++...

Je ne vois pas en quoi std::vector devrait être utilisé comme tu dis... s'il a besoin d'un tableau il utilise un tableau, pas un vector !


Bon, c'était sûrement mal formulé (tout dépend de comment on le lit), mais explique moi alors pourquoi utiliser un tableau C-Like et pas un std::vector ? une VRAIE raison, pas du genre "on a pas besoin de redimensionner" qui ne justifie rien du tout.
Tu utilises un char* ou un std::string ? on peut continuer longuement.
Avatar de l’utilisateur
Gabriel
 
Messages: 311
Inscription: 25 Fév 2006, 10:15

Messagepar teto » 15 Sep 2011, 17:10

quitte à faire de la 1D, autant utiliser vector !

(et en 2D boost::multi_index)

Nb: Valentin a réussi à mettre le feu à Irc et à ce topic. Bravo ^^
Avatar de l’utilisateur
teto
 
Messages: 1168
Inscription: 26 Juil 2005, 19:02
Localisation: /home/Paris

Messagepar valentin » 15 Sep 2011, 17:10

quitte à paufiner rajoute:
Code: Tout sélectionner
    assert(x >= 0);
    assert(y >= 0);


Bon sans déc, topic Résolu, on va pas débattre 15 jours la dessus, ou alors on a vraiment rien de mieux à faire...
Avatar de l’utilisateur
valentin
Hello World, I'm new !
 
Messages: 494
Inscription: 20 Mai 2008, 16:10
Localisation: GRENOBLE

Messagepar Eva » 15 Sep 2011, 18:01

Code: Tout sélectionner
template<unsigned int N, unsigned int M>
class mother {
   int tab[N][M];

public:
   int get(unsigned int n, unsigned int m){ return tab[n][m]; }
   void set(unsigned int n, unsigned int m, int value){ tab[n][m] = value; }
};

class daugther : public mother<5, 6> {
};


Image
Avatar de l’utilisateur
Eva
Hello World, I'm new !
 
Messages: 651
Inscription: 31 Mai 2005, 15:43

Messagepar Aranoth » 15 Sep 2011, 18:47

Gabriel a écrit:Bon, c'était sûrement mal formulé (tout dépend de comment on le lit), mais explique moi alors pourquoi utiliser un tableau C-Like et pas un std::vector ? une VRAIE raison, pas du genre "on a pas besoin de redimensionner" qui ne justifie rien du tout.
Tu utilises un char* ou un std::string ? on peut continuer longuement.
Parce que les tableaux ne sont pas "C-like" et que std::vector utilise déjà un tableau dans son implémentation ? Pourquoi rajouter une couche dont tu n'as pas besoin, avec tous les désavantages que cela comporte ?

Et j'utilise aussi bien char* que std::string selon les situations... Utilises l'outil dont tu as besoin, ni plus ni moins.
Avatar de l’utilisateur
Aranoth
Hello World, I'm new !
 
Messages: 1327
Inscription: 10 Avr 2005, 00:10
Localisation: Montréal

Messagepar Gabriel » 15 Sep 2011, 19:23

Aranoth a écrit:Parce que les tableaux ne sont pas "C-like" et que std::vector utilise déjà un tableau dans son implémentation ? Pourquoi rajouter une couche dont tu n'as pas besoin, avec tous les désavantages que cela comporte ?

Et j'utilise aussi bien char* que std::string selon les situations... Utilises l'outil dont tu as besoin, ni plus ni moins.


Alors, faut vraiment que tu me donnes les désavantages que std::vector a, car sur les exemples données précédemment, c'est exactement la même chose sauf que std::vector apporte bien plus de choses.

Il développe des programmes orientée objet (il a clairement dit dans le premier post), dans la logique, c'est respecter ce paradigme.
Avatar de l’utilisateur
Gabriel
 
Messages: 311
Inscription: 25 Fév 2006, 10:15

Messagepar Eva » 15 Sep 2011, 19:42

Ma solution est bien meilleure que les vôtres, pour les raisons citées ci-dessous :
  1. C'est moi qui l'ai proposée.
  2. Elle a aucun coût temporel à l'exécution.
  3. Elle est "compliquée" comme le C++...
  4. Et pis j'ai raison d'abord.
Avatar de l’utilisateur
Eva
Hello World, I'm new !
 
Messages: 651
Inscription: 31 Mai 2005, 15:43

Messagepar Aranoth » 15 Sep 2011, 19:46

Gabriel, je pense tu viens de te répondre à toi même sans t'en apercevoir.

Tu sembles considérer qu'utiliser une classe fournie par une bibliothèque externe (en l’occurrence la STL) plutôt qu'une construction du langage est une règle de l'OOP.

D'autant plus que tu le dis toi même :
Gabriel a écrit:sur les exemples données précédemment, c'est exactement la même chose


Je ne tiens pas à argumenter contre de la logique Shadock. Pour moi le but est d'écrire du code simple, et pas de le rendre inutilement compliqué au nom de tel ou tel paradigme.


[quote="valentin"]quitte à paufiner rajoute:
Code:

assert(x >= 0)]Ou mieux : utilises des unsigned int, comme ça tu catches les erreurs à la compilation et pas à l’exécution.
Avatar de l’utilisateur
Aranoth
Hello World, I'm new !
 
Messages: 1327
Inscription: 10 Avr 2005, 00:10
Localisation: Montréal

Messagepar Gabriel » 15 Sep 2011, 20:02

C'est fort ça :

Tu sembles considérer qu'utiliser une classe fournie par une bibliothèque externe (en l’occurrence la STL) plutôt qu'une construction du langage est une règle de l'OOP.


La STL, c'est Standard Template Library, ça fait partie du standard C++ hein ! et oui, je préfère (et il faut !) utiliser les outils fournit par le langage que des constructions personnelles pour soit réinventer la roue, soit perdre en robustesse/lisibilité/maintenabilité/... pour rien gagner en échange (oui, les perfs sont les même).

Et oui, je le dis moi même, c'est exactement la même, mais la prochaine fois, cite moi en entier car je rajoute "sauf que std::vector apporte bien plus de choses." et c'est là toute la différence.

Je ne tiens pas à argumenter contre de la logique Shadock. Pour moi le but est d'écrire du code simple, et pas de le rendre inutilement compliqué au nom de tel ou tel paradigme.


Alors je suppose que std::vector complique la vie pourtant c'est le CONTRAIRE ! ça simplifie la vie. Donc tu viens de t'auto répondre, mais bref tu réponds pas vraiment à ma question des désavantages par rapport aux exemples données de std::vector.

Enfin bon, on arrive à un débat sans fin.
Avatar de l’utilisateur
Gabriel
 
Messages: 311
Inscription: 25 Fév 2006, 10:15

Messagepar Nieluj » 15 Sep 2011, 20:15

Faut pas s'énerver pour si peu les enfants :) . Formons nous les un les autres mais avec un peu d'humilité si possible.
Avatar de l’utilisateur
Nieluj
Hello World, I'm new !
 
Messages: 110
Inscription: 27 Oct 2009, 14:11

Messagepar Aranoth » 15 Sep 2011, 20:21

Gabriel a écrit:La STL, c'est Standard Template Library, ça fait partie du standard C++ hein ! et oui, je préfère (et il faut !) utiliser les outils fournit par le langage que des constructions personnelles pour soit réinventer la roue, soit perdre en robustesse/lisibilité/maintenabilité/... pour rien gagner en échange (oui, les perfs sont les même).
La STL fait partie du standard, pas du langage. Tu peux utiliser C++ sans l'inclure et sans linker avec. Les tableaux, eux, sont une construction du langage... pas un truc perso.

Appeler new et delete (ou mieux, utiliser la solution d'Eva) ce n'est pas "réinventer la roue", c'est utiliser des fonctionnalités qui ont été faites pour ça.

Et je ne vois pas en quoi tu perds en robustesse, au contraire en utilisant uniquement ce dont tu as besoin tu réduit la surface potentielle de bugs et tu simplifies la logique et la lisibilité de ton programme.

Ajouter "bien plus de choses" que tu n'en as besoin n'est PAS une bonne chose !

Et étant donné que c'est le deuxième thread où Nieluj rencontre des problèmes avec std::vector, j'ai des doutes sur le côté "ça simplifie la vie".
S'il avait un tableau dynamique, j'aurais dit oui. Mais ce n'est pas le cas.


Gabriel a écrit:mais bref tu réponds pas vraiment à ma question des désavantages par rapport aux exemples données de std::vector.
Si, je t'ai répondu mais tu vois ça comme des avantage. A partir de là je ne peux vraiment rien faire de plus.

Aucune discussion n'est possible quand on ne part pas des même axiomes.
Avatar de l’utilisateur
Aranoth
Hello World, I'm new !
 
Messages: 1327
Inscription: 10 Avr 2005, 00:10
Localisation: Montréal

Messagepar valentin » 15 Sep 2011, 20:40

+1 pour Aranoth
Avatar de l’utilisateur
valentin
Hello World, I'm new !
 
Messages: 494
Inscription: 20 Mai 2008, 16:10
Localisation: GRENOBLE

Suivante

Retourner vers Programmation

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 8 invités