[C, C++] Tableau d'objets

Tableau d'objets [C, C++] - C++ - Programmation

Marsh Posté le 10-09-2002 à 15:01:51    

Mon pb est assez complexe a expliquer.
J'ai cree une classe que j'appelle CMaClasse. J'aimerai passer au constructeur un tableau d'objets de type CMaClasse2.
Ma question est : Quelle est la syntaxe que je dois utiliser pour mon tableau sachant que le constructeur de la classe CMaClasse2 prend plusieurs parametres qu'il faut obligatoirement initialiser?
Ex:

Code :
  1. CMaClasse2::CMaClasse2(CString string1, CString string2)
  2. {
  3. }


Au debut, j'avais utilise un tableau de structures que j'initialisais comme ceci:

Code :
  1. Mystruct_t Tab[2] =
  2. {
  3.      {"toto", "titi"},
  4.      {"tata", "tutu"}
  5. };


 
En fait, j'aimerai remplacer la structure Mystruct_t par la classe CMaClasse2.


---------------
LOVE & PEACE !!! [:kirvel]
Reply

Marsh Posté le 10-09-2002 à 15:01:51   

Reply

Marsh Posté le 10-09-2002 à 15:12:04    

try58 a écrit a écrit :

Mon pb est assez complexe a expliquer.
J'ai cree une classe que j'appelle CMaClasse. J'aimerai passer au constructeur un tableau d'objets de type CMaClasse2.
Ma question est : Quelle est la syntaxe que je dois utiliser pour mon tableau sachant que le constructeur de la classe CMaClasse2 prend plusieurs parametres qu'il faut obligatoirement initialiser?
Ex:

Code :
  1. CMaClasse2::CMaClasse2(CString string1, CString string2)
  2. {
  3. }


Au debut, j'avais utilise un tableau de structures que j'initialisais comme ceci:

Code :
  1. Mystruct_t Tab[2] =
  2. {
  3.      {"toto", "titi"},
  4.      {"tata", "tutu"}
  5. };


 
En fait, j'aimerai remplacer la structure Mystruct_t par la classe CMaClasse2.




 
Tableau d'objet => constructeur par défaut. Si t'as pas de constructeur par défaut tu peux pour une classe pas faire de tableau d'objet de cette classe.
 
Après ça marche comme les tableau te types atomiques (ça se dit ça? comme des int quoi :D)


---------------
Le Tyran
Reply

Marsh Posté le 10-09-2002 à 15:16:43    

Qu'est ce que tu entends par constructeur par defaut? un constructeur sans parametre?


---------------
LOVE & PEACE !!! [:kirvel]
Reply

Marsh Posté le 10-09-2002 à 15:19:24    

try58 a écrit a écrit :

Qu'est ce que tu entends par constructeur par defaut? un constructeur sans parametre?




 
c ça, ou dont tous les paramètres ont une valeur par défaut.


---------------
Le Tyran
Reply

Marsh Posté le 10-09-2002 à 15:27:01    

letoII a écrit a écrit :

 
 
c ça, ou dont tous les paramètres ont une valeur par défaut.



Donc le seul moyen c'est d'utiliser la structure a la place de la classe, comme j'ai ecrit precedement !?


---------------
LOVE & PEACE !!! [:kirvel]
Reply

Marsh Posté le 10-09-2002 à 15:28:37    

try58 a écrit a écrit :

Donc le seul moyen c'est d'utiliser la structure a la place de la classe, comme j'ai ecrit precedement !?




 
Ben tu peux aussi faire un tableau et puis initiliser tes données de chaque objet aprés.


---------------
Le Tyran
Reply

Marsh Posté le 10-09-2002 à 15:35:07    

letoII a écrit a écrit :

 
 
Ben tu peux aussi faire un tableau et puis initiliser tes données de chaque objet aprés.




ok, je vais faire comme ca, merci!
Sinon je voulais savoir, (au risque de faire partir ce topic a coup de trolls) si c'est correct d'utiliser les structures en c++?


---------------
LOVE & PEACE !!! [:kirvel]
Reply

Marsh Posté le 10-09-2002 à 15:42:25    

try58 a écrit a écrit :

 
ok, je vais faire comme ca, merci!
Sinon je voulais savoir, (au risque de faire partir ce topic a coup de trolls) si c'est correct d'utiliser les structures en c++?




 
C pas génial mais pour faire des trucs simple pkoi pas


---------------
Le Tyran
Reply

Marsh Posté le 10-09-2002 à 15:44:30    

letoII a écrit a écrit :

 
 
C pas génial mais pour faire des trucs simple pkoi pas



Ok!


---------------
LOVE & PEACE !!! [:kirvel]
Reply

Marsh Posté le 10-09-2002 à 16:45:09    

en C++, struct == class
qu'on se le dise.
 
la difference c'est les droits d'acces
public par defaut pour une struct
et private par defaut pour une classe
c'est tout.
 
LeGreg

Reply

Marsh Posté le 10-09-2002 à 16:45:09   

Reply

Marsh Posté le 10-09-2002 à 16:51:11    

legreg a écrit a écrit :

en C++, struct == class
qu'on se le dise.
 
la difference c'est les droits d'acces
public par defaut pour une struct
et private par defaut pour une classe
c'est tout.
 
LeGreg




 
Jamais dit le contraire, mais je trouve l'utilisation des struct légérement moin propre. Bon ca m'empéche pas de les utiliser.


---------------
Le Tyran
Reply

Marsh Posté le 11-09-2002 à 11:22:15    

letoII a écrit a écrit :

 
 
Tableau d'objet => constructeur par défaut. Si t'as pas de constructeur par défaut tu peux pour une classe pas faire de tableau d'objet de cette classe.
 
Après ça marche comme les tableau te types atomiques (ça se dit ça? comme des int quoi :D)




 
Atomique oauip ca se dit, c'est comme la balle.
 
les struct sinon c sympa pour passer des kilos d'arguments à une méthode bien chiadée.

Reply

Marsh Posté le 11-09-2002 à 11:29:47    

Joel F a écrit a écrit :

 
 
Atomique oauip ca se dit, c'est comme la balle.
 
les struct sinon c sympa pour passer des kilos d'arguments à une méthode bien chiadée.




Tu peux faire la meme chose avec une classe et des kilos de variables membres


---------------
LOVE & PEACE !!! [:kirvel]
Reply

Marsh Posté le 11-09-2002 à 11:32:24    

ouaip c moins chiant le truc du style :
 

Code :
  1. struct OPENGLARG
  2. {
  3.   int bpp;
  4.   int width;
  5. .
  6. .
  7. .
  8. };


 
que
 

Code :
  1. class OpenGLArg
  2. {
  3. public get/setBPP()
  4. etc ...
  5. };


Message édité par Joel F le 11-09-2002 à 11:32:35
Reply

Marsh Posté le 11-09-2002 à 12:55:17    

CMaClasse2 Tab[] =
{
 CMaClasse2("toto", "titi" ),
 CMaClasse2("toto", "titi" )
};

Reply

Marsh Posté le 11-09-2002 à 14:49:17    

letoII a écrit a écrit :

 
Jamais dit le contraire, mais je trouve l'utilisation des struct légérement moin propre. Bon ca m'empéche pas de les utiliser.




 
c'est marrant que tu dises ca parce qu'assez paradoxal
en quoi une struct est moins propre qu'une classe
quand il s'agit de la meme chose en fait
(avec un public en moins, ca epargne une ligne de code).
 
En fait, en y reflechissant, une struct ca sert a la compatibilité du C, c'est pour ca que c'est present,
si le C++ avait ete crée de "zero", sans doute n'y aurait-il
jamais eu de mot clé struct en C++ (comme il n'y aurait pas
eu de distinction pointeur/reference et les arrays auraient ete moins merdiques et j'en passe :) ).
 
Sinon le seul probleme de proprete (outre de faire cohabiter deux notations redondantes) que je vois c'est
pour le sacro saint principe d'encapsulation de la POO
les variables membres par défaut étant public ca encouragerait
a les laisser public, ce qui est plutot mauvais.
 
Donc oui, peut-etre mais..
(reponse de normand :) )
 
LeGreg

Reply

Marsh Posté le 11-09-2002 à 14:54:20    

legreg a écrit a écrit :

 
 
c'est marrant que tu dises ca parce qu'assez paradoxal
en quoi une struct est moins propre qu'une classe
quand il s'agit de la meme chose en fait
(avec un public en moins, ca epargne une ligne de code).
 
En fait, en y reflechissant, une struct ca sert a la compatibilité du C, c'est pour ca que c'est present,
si le C++ avait ete crée de "zero", sans doute n'y aurait-il
jamais eu de mot clé struct en C++ (comme il n'y aurait pas
eu de distinction pointeur/reference et les arrays auraient ete moins merdiques et j'en passe :) ).
 
Sinon le seul probleme de proprete (outre de faire cohabiter deux notations redondantes) que je vois c'est
pour le sacro saint principe d'encapsulation de la POO
les variables membres par défaut étant public ca encouragerait
a les laisser public, ce qui est plutot mauvais.

 
Donc oui, peut-etre mais..
(reponse de normand :) )
 
LeGreg




 
C exactement a ça que je pensais.


---------------
Le Tyran
Reply

Marsh Posté le 11-09-2002 à 14:56:49    

kenshiro182 a écrit a écrit :

CMaClasse2 Tab[] =
{
 CMaClasse2("toto", "titi" ),
 CMaClasse2("toto", "titi" )
};




Merci je vais essayer de suite !


---------------
LOVE & PEACE !!! [:kirvel]
Reply

Marsh Posté le 12-09-2002 à 03:26:35    

Code :
  1. class C{public:
  2. C(int){}
  3. };
  4. C tab[3]= {1,2,3};

Ça c'est permis, pas de problème.
 

Code :
  1. class C{public:
  2. C(int, char){}
  3. };
  4. C tab[3]= {{1,'A'},{2,'B'},{3,'C'}};

Ça non, pourquoi ?
Parce que les accolades initialisent des tableaux ou des membres de structure, mais pas des arguments de constructeurs.
Dans le premier exemple, en fait, il y a juste conversion implicite des nombres en C.
Et le C(++) ne convertit pas implicitement plusieurs valeurs en une seule !
 

Code :
  1. class C{public:
  2. C(int, char=' '){}
  3. };
  4. C tab[3]= {1,2,3};

Deux arguments, dont un avec valeur par défaut. Pas très intéressant, mais...

Code :
  1. char Cfiller(){
  2. static int n= 0;
  3. static char fill[]= {'A','B','C'};
  4. return fill[n++];
  5. }
  6. class C{public:
  7. int i;
  8. char c;
  9. C(int ii, char cc= Cfiller()):i(ii),c(cc){}
  10. };
  11. C tab[3]= {1,2,3};

Voilà un moyen détourné, illisible et dangereux d'y parvenir.
Et bogué en plus: l'ordre dans lequel les éléments du tableau sont construits (et recoivent les valeurs) est dépendant du compilateur.
 
Non, la bonne solution que j'avais oublié et que kenshiro182 rapelles, c'est de construire explicitement chaque objet.
 
 

legreg a écrit a écrit :

...comme il n'y aurait pas
eu de distinction pointeur/reference...


Peut-être que si. Y'a quand même pas mal de différences:
Pointeurs: explicite, puissant, dangereux, NULL possible.
Référence: implicite, simple  , sûr      , toujours valide.


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
Reply

Marsh Posté le 25-09-2002 à 10:18:30    

Comment je peux faire pour terminer mon tableau? J'ai essaye en mettant 0 a la fin mais il me dit : impossible de convertir de 'int' en 'CMaClasse2'.


---------------
LOVE & PEACE !!! [:kirvel]
Reply

Marsh Posté le 25-09-2002 à 10:33:07    

try58 a écrit a écrit :

Comment je peux faire pour terminer mon tableau? J'ai essaye en mettant 0 a la fin mais il me dit : impossible de convertir de 'int' en 'CMaClasse2'.  




 
 :heink:


---------------
Le Tyran
Reply

Marsh Posté le 25-09-2002 à 15:00:35    

Musaran a écrit a écrit :

Code :
  1. [cpp]class C{public:
  2. C(int, char){}
  3. };
  4. C tab[3]= {{1,'A'},{2,'B'},{3,'C'}};

Ça non, pourquoi ?
Parce que les accolades initialisent des tableaux ou des membres de structure, mais pas des arguments de constructeurs.




Ca ne fait pas beaucoup de différence avec ça du point de vue syntaxe :

Code :
  1. C tab[3]= { C(1, 'A') , C(2, 'B'), C(3, 'C') };


(sauf que ça, ça marche, comme kenshiro182 l'a dit).


Message édité par BifaceMcLeOD le 25-09-2002 à 15:02:10
Reply

Marsh Posté le 26-09-2002 à 02:13:53    

C'est juste une mauvaise surprise pour celui qui veut faire évoluer une structure C en classe C++.
 
Le premier ne marche qu'avec des aggrégats sans constructeurs.
Le second ne marche qu'avec des constructeurs.


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
Reply

Marsh Posté le 26-09-2002 à 09:57:23    

:jap:

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed