[C++ débutant]Constructeur prenant un nombre de paramètres variable ?

Constructeur prenant un nombre de paramètres variable ? [C++ débutant] - C++ - Programmation

Marsh Posté le 17-02-2006 à 19:27:34    

Bonjour,  
 
Est-ce possible de faire un constructeur avec un nombre variable de paramètres ? (comme une fonction style int fonction(param, ...))
 
Je dois pouvoir créer une liste d'objets soit à partir d'une autre liste d'objets (facile), ou bien à partir de plusieurs objets ... mais je ne sais pas combien ! Sinon, comment procéder ?
 
 :jap:


---------------
Pier noir la mèr - La chanson par HFR Band - Topic TrueCrypt
Reply

Marsh Posté le 17-02-2006 à 19:27:34   

Reply

Marsh Posté le 17-02-2006 à 20:33:56    

tu recuperes les parametres avec un std::va_list (<cstdarg> ) et les macros va_start, va_arg et va_end mais c'est assez dangereux à utiliser dans la mesure ou on peut refiler n'importe quoi (en terme de type et de nombre d'argument) à ce genre de fonction, aucun controles ne peut etre fais à la compilation
 
le mieux c'est de faire des push_back

Reply

Marsh Posté le 17-02-2006 à 20:36:27    

c'est de la grosse daube les va_list.

Reply

Marsh Posté le 17-02-2006 à 21:27:53    

Push back ? :??:  
 
Sinon, tant pis, je ferai une fonction intermédiaire ... m'enfin bon
Merci de vos réponses :)


---------------
Pier noir la mèr - La chanson par HFR Band - Topic TrueCrypt
Reply

Marsh Posté le 17-02-2006 à 21:34:08    

ParadoX a écrit :

Push back ? :??:


 
ton type liste fourni bien des méthodes pour l'insertion d'objet ?

Reply

Marsh Posté le 17-02-2006 à 21:50:32    

std::vector<>

Reply

Marsh Posté le 18-02-2006 à 08:08:01    

skelter a écrit :

ton type liste fourni bien des méthodes pour l'insertion d'objet ?


 
Jep, mais pour le reste, je n'ai le droit d'utiliser que Iostream.h (restriction de l'énoncé) (bon, et va_arg a la limite)


---------------
Pier noir la mèr - La chanson par HFR Band - Topic TrueCrypt
Reply

Marsh Posté le 18-02-2006 à 08:59:55    

ParadoX a écrit :

Jep, mais pour le reste, je n'ai le droit d'utiliser que Iostream.h


 
putain mais NON :
#include <iostream>
pas iostream.h
...
 
pr tn probleme, utilise un std::vector

Reply

Marsh Posté le 19-02-2006 à 16:30:10    

Oui mais le monsieur veut utiliser plusieurs objets :o

Reply

Marsh Posté le 19-02-2006 à 17:36:40    

Joel F a écrit :

putain mais NON :
#include <iostream>
pas iostream.h
...
 
pr tn probleme, utilise un std::vector


 
C'est pas la peine de s'énerver, hein [:mlc]  
Je ne connais pas std::vector ! Je n'ai droit qu'a iostream.h ...  
 
Je vais tenter le constructeur en va_arg ..


---------------
Pier noir la mèr - La chanson par HFR Band - Topic TrueCrypt
Reply

Marsh Posté le 19-02-2006 à 17:36:40   

Reply

Marsh Posté le 19-02-2006 à 17:41:11    

non. apprend std::vector. va_arg c'est pas dans iostream.h non plus. va_arg c'est de la chiasse pas sur au niveau des types ni au niveau de rien. viens pas nous cassez les bonbons si ça marche pas, on a qu'une seule réponse : std::vector

Reply

Marsh Posté le 19-02-2006 à 17:45:56    

Je répète que je n'ai pas le droit, d'après le sujet ^^


---------------
Pier noir la mèr - La chanson par HFR Band - Topic TrueCrypt
Reply

Marsh Posté le 19-02-2006 à 18:04:09    

Si le prof a dis qu'il veut pas, il veut pas (ni pour les push_back, ni pour la classe string, ni pour la stl tout court), y'avais un constructeur a paramètre variable samedi matin :hello:  
Par exemple, avec juste un constructeur a paramètres variable, le premier c'est la taille du tableau, v la première valeur, ... :

Code :
  1. class A
  2. {
  3. private:
  4.     int * tab, taille;
  5. public:
  6.     A(unsigned int t, int v, ...)
  7.     {
  8.         taille = t;
  9.         tab = new int[t];
  10.         tab[0] = v;
  11.         
  12.         va_list varg; // déclare ta liste
  13.         va_start(varg, v); // début
  14.         for (int i = 1; i < t; i++)
  15.             tab[i] = va_arg(varg, int); // t'extrais des type int
  16.         va_end(varg); // c'est fini
  17.     }
  18. };
  19.  
  20. // ...
  21. A truc(3, 11, 29, 42);
  22. A blabla(10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10);


Y'a pas de test toussa, pataper :o..

Reply

Marsh Posté le 19-02-2006 à 18:13:08    

Flaie a écrit :

Si le prof a dis qu'il veut pas, il veut pas (ni pour les push_back, ni pour la classe string, ni pour la stl tout court), y'avais un constructeur a paramètre variable samedi matin :hello:  
Par exemple, avec juste un constructeur a paramètres variable, le premier c'est la taille du tableau, v la première valeur, ... :

Code :
  1. class A
  2. {
  3. private:
  4.     int * tab, taille;
  5. public:
  6.     A(unsigned int t, int v, ...)
  7.     {
  8.         taille = t;
  9.         tab = new int[t];
  10.         tab[0] = v;
  11.         
  12.         va_list varg; // déclare ta liste
  13.         va_start(varg, v); // début
  14.         for (int i = 1; i < t; i++)
  15.             tab[i] = va_arg(varg, int); // t'extrais des type int
  16.         va_end(varg); // c'est fini
  17.     }
  18. };
  19.  
  20. // ...
  21. A truc(3, 11, 29, 42);
  22. A blabla(10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10);


Y'a pas de test toussa, pataper :o..


 
 
Merci ^^
Jep, j'ai posté ce sujet la veille du partiel, et hop au partiel un constructeur à parametres variables  [:ddr555] Au moins, j'avais ma réponse. Ceci dit, je n'ai pas répondu juste à ce truc :D
 
Merci en tout cas, on va essayer de rattrapper tout ça avec le projet :jap:  
J'esaye, je reviendrai poster quand ça plantera :o
 
PS: T'es en l3 ? iup ?  
 
 :hello:


---------------
Pier noir la mèr - La chanson par HFR Band - Topic TrueCrypt
Reply

Marsh Posté le 19-02-2006 à 18:22:35    

Ahah pas de bol pour le partiel :o, pour le projet ça serait marrant qu'il compte comme contrôle continu :D.
Ah ouais et faut inclure stdargs.h pour va_arg, et compagnie :).
 
PS : en L3 sécurité sytème et je sais plus quoi :hello:


Message édité par Flaie le 19-02-2006 à 18:24:42
Reply

Marsh Posté le 19-02-2006 à 18:26:27    

si t'as pas le droit à vector, t'as encore moins le droit à va_arg

Reply

Marsh Posté le 19-02-2006 à 18:31:06    

Étrangement c'est autorisé :) justement il en veut un pour une certaine classe :o.
C'est compliqué quoi :whistle:.

Reply

Marsh Posté le 19-02-2006 à 19:03:28    

Reply

Marsh Posté le 19-02-2006 à 19:03:36    

Comment apprendre aux étudiants à ajouter des trous de sécurité dans leurs interfaces.  
En plus en Visual C++ 6... :pfff:
Ca devrait être interdit, les profs comme ça.

Message cité 1 fois
Message édité par el muchacho le 19-02-2006 à 19:05:00
Reply

Marsh Posté le 19-02-2006 à 19:05:18    

el muchacho a écrit :

Comment apprendre aux étudiants à ajouter des trous de sécurité dans leurs interfaces. Ca devrait être interdit, les profs comme ça. :pfff:


 
On n'est pas obligés d'utiliser un constructeur pareil, sauf que je pense que c'est la meilleure solution. Et d'un autre coté, je suis débutant, hein ... alors l'aspect pédagogique prime je pense. Comme dirait notre prof: "C'est moche et ça sert à rien ... mais c'est pédagogique" :D


---------------
Pier noir la mèr - La chanson par HFR Band - Topic TrueCrypt
Reply

Marsh Posté le 19-02-2006 à 19:09:42    

ParadoX a écrit :

On n'est pas obligés d'utiliser un constructeur pareil, sauf que je pense que c'est la meilleure solution. Et d'un autre coté, je suis débutant, hein ... alors l'aspect pédagogique prime je pense. Comme dirait notre prof: "C'est moche et ça sert à rien ... mais c'est pédagogique" :D


Justement non. Ca n'est pas pédagogique. Quand on apprend le piano, on commence par les gammes. Je vois que rien n'interdit d'utiliser la STL, alors apprends la STL, c'est un passage obligé. Taz t'a dit std::vector<>, ça n'est pas pour rien. Et de plus, même si ça parait compliqué au début, tu vas assez vite t'apercevoir que c'est très pratique. Tellement pratique, même, que tout le monde l'utilise. Malheureusement, vous devez utiliser VC++ 6, qui n'est pas standard, mais ça, vous n'y pouvez rien.

Message cité 1 fois
Message édité par el muchacho le 19-02-2006 à 19:11:29
Reply

Marsh Posté le 19-02-2006 à 19:10:48    

nan mais bon, ok, mais fo aussi savoir faire par soit meme des vecteurs. Je vois quand meme un peu l'idée derriere tout ca ...a

Reply

Marsh Posté le 19-02-2006 à 19:14:13    

el muchacho a écrit :

Justement non. Ca n'est pas pédagogique. Quand on apprend le piano, on commence par les gammes. Je vois que rien n'interdit d'utiliser la STL, alors apprends la STL, c'est un passage obligé. Taz t'a dit std::vector<>, ça n'est pas pour rien. Et de plus, même si ça parait compliqué au début, tu vas assez vite t'apercevoir que c'est très pratique. Tellement pratique, même, que tout le monde l'utilise. Malheureusement, vous devez utiliser VC++ 6, qui n'est pas standard, mais ça, vous n'y pouvez rien.


 
L'interdiction d'utiliser autre chose que iostream et varg a été donnée oralement par la suite, par le prof :sweat:
Enfin merci, jvais quand même aller regarder ce que c'est ... :)
 
 :hello:


---------------
Pier noir la mèr - La chanson par HFR Band - Topic TrueCrypt
Reply

Marsh Posté le 19-02-2006 à 19:14:26    

Créer des containers est un exercice à part, je ne vois pas bien l'intérêt de le surajouter au pb posé qui est un outil de dessin vectoriel. Ca devrait au moins être sugééré dans le sujet si le prof veut cela.

Reply

Marsh Posté le 19-02-2006 à 19:18:23    

ParadoX a écrit :

Pour les curieux:
 
http://orgasm.free.fr/hfr/sujetc++.jpg
 
Flaie: ça avance, vous ? :sweat:


Ouais VC++ 6 c'est clair qu'il date, au deuxième semestre c'est VC++ 7 et Borland C++ Builder 4 :sweat:, on pourrais au moins prendre des versions à jour tant qu'a faire ... mais bon ça me dérange pas plus que ça, dans l'ensemble ça compile bien, y'a des trucs qui passent avec g++ mais pas avec VC++ genre cout.rdbuf() qui merde par exemple, ça dois d'ailleurs sûrement se régler, j'ai pas trop cherché.. :o
 
Pour le projet ouais il est fini, y'a plus qu'a taper le rapport :o.  
 
Le prof est sympa, ses cours également, et il réponds volontier a nos questions, le reste c'est du bonus :).


---------------
Always wear a camera!
Reply

Marsh Posté le 19-02-2006 à 19:58:39    

C'est de quel niveau ? Licence ? En tous cas, j'ai réalisé quelque chose de similaire avec Visual C++ 6.0 pour un autre besoin (professionnel) mais l'interface était la souris pas la ligne de commande et on pouvait effectuer une rotation des objets.


Message édité par slash33 le 19-02-2006 à 20:00:12
Reply

Marsh Posté le 19-02-2006 à 20:43:56    

Reply

Marsh Posté le 22-02-2006 à 20:13:28    

Désolé de faire le lourd, mais ... ça ne marche pas :/
 
.h

Code :
  1. class Groupe : public Objet
  2. {
  3. friend void main();
  4. private:
  5.  Liste monGroupe;
  6. public:
  7.  Groupe();
  8.  Groupe(char *nom, unsigned int t, Objet &, ...);
  9.  //Groupe(const Liste & );
  10. };


 
.cpp

Code :
  1. Groupe::Groupe(char *nom, unsigned int t, Objet & monObjet, ...) : Objet(nom)
  2. {
  3. monGroupe.ajoutTete(monObjet);
  4. Iterateur_w monIterateur(monGroupe);
  5. va_list varg; // déclare ta liste
  6. va_start(varg, monObjet); // début
  7. for (unsigned int i = 1; i < t; i++)
  8. {
  9.  monIterateur.ajouter((va_arg(varg, Objet)), monGroupe);
  10. }
  11. va_end(varg);
  12. }


 
ça compile, et le groupe est crée avec le bon nom ... sauf que la liste contenue n'a pas le bon contenu :/ (et ce n'est pas la méthode d'insertion qui foire !)
 
Qqun a une idée ? :/


Message édité par ParadoX le 22-02-2006 à 20:14:46

---------------
Pier noir la mèr - La chanson par HFR Band - Topic TrueCrypt
Reply

Marsh Posté le 22-02-2006 à 23:08:55    

Pourquoi le i=1 en ligne 9 de Groupe::Groupe ?

Reply

Marsh Posté le 23-02-2006 à 01:12:39    

Bah pour qu'il ajoute les n-1 restants ...
Le nb d'elements est bon, mais pas le contenu !
 
C'est le va_arg qui pose pb, avec un constructeur avec 3 formes, ça marche nickel:
 

Code :
  1. Groupe::Groupe(char *nom, Objet &monObjet, Objet &monObjet1, Objet &monObjet2) : Objet(nom)
  2. {
  3. monGroupe.ajoutFin(monObjet);
  4. monGroupe.ajoutFin(monObjet1);
  5. monGroupe.ajoutFin(monObjet2);
  6. }


Message édité par ParadoX le 23-02-2006 à 01:36:19

---------------
Pier noir la mèr - La chanson par HFR Band - Topic TrueCrypt
Reply

Marsh Posté le 23-02-2006 à 13:23:10    

Juste pour savoir... c'est pour gérer quoi le contructeur a variable multiple ?  ( par rapport à l'ennoncé du projet )

Reply

Marsh Posté le 23-02-2006 à 16:56:23    

Créer un groupe à partir de figures ... mais on ne sait pas combien !


---------------
Pier noir la mèr - La chanson par HFR Band - Topic TrueCrypt
Reply

Marsh Posté le 23-02-2006 à 17:30:24    

faut que l'interface de Groupe permette d'effectuer cette opération
monGroupe.ajoutFin(monObjet);
 
c'est beaucoup trop dangereux avec va_arg et moins flexible à l'utilisation (faut preciser le nombre d'objet passés en parametre)

Reply

Marsh Posté le 23-02-2006 à 18:01:13    

L'interface ?  
 
Mais la méthode fonctionne avec un constructeur "normal", avec disons 3 objets ... pourquoi pâs avec Varg ?  :sweat:


---------------
Pier noir la mèr - La chanson par HFR Band - Topic TrueCrypt
Reply

Marsh Posté le 23-02-2006 à 18:41:54    

Le compilateur va sûrement se plaindre si tu passe un objet à fonction(...). Essaye avec prinf() pour voir.  
 
Il faudrait donc utiliser des pointeurs vers new objets, genre:
fonction(new Objet(),new Objet(),new Objet(),NULL);
 
De toutes manières, il n y a pas de vérification de typage, ce qui rends les arguments variables peu recommandables.
 
En général, avec C++ on redéfinit un opérateur spécial pour celà. Exemple:
 

Code :
  1. #include <stdio.h>
  2. class Objet;
  3. class Groupe
  4. {
  5.   public:
  6.   Objet* _first;
  7.   Groupe(Objet* o=0): _first(o) { }
  8.   Groupe& operator , (Objet* o);
  9. };
  10. class Objet
  11. {
  12.   public:
  13.   int _i;
  14.   Objet* _next;
  15.   Objet(int i): _i(i) { }
  16.   Groupe operator , (Objet* o)
  17.   { Groupe g; return g,o; }
  18. };
  19. Groupe& Groupe::operator , (Objet* o)
  20. { o->_next=_first; _first=o; return *this; }
  21. int main(int argc, char** argv)
  22. {
  23.   Groupe g;
  24.   g=new Objet(1),new Objet(2),new Objet(3);
  25.   for(Objet* o=g._first;o;o=o->_next)
  26.     printf("%d\n",o->_i);
  27.   return 0;
  28. }


 
Tu peux coder la même chose avec:
Groupe& Groupe::operator , (const Objet& o);
si tu as une sous-classe de Groupe pour stocker des objets.
Ensuite:
Groupe g=Objet(),Objet(),Objet();
 
 
 

Reply

Marsh Posté le 23-02-2006 à 18:45:05    

Citation :

L'interface ?


 
les méthodes publique, les opérations fournies à l'utilisateur de la classe
 

Code :
  1. void Groupe::ajoutFin(const Objet & monObjet)
  2. {
  3. monGroupe.ajoutFin(monObjet);
  4. }


 

Citation :

Mais la méthode fonctionne avec un constructeur "normal", avec disons 3 objets ... pourquoi pâs avec Varg ?


 
parce que c'est dégueulasse et tu peux facilement corrompre la pile

Reply

Marsh Posté le 23-02-2006 à 20:48:54    

si je résume, on a de la branlette parce que ça veut pas faire un new[]

Reply

Marsh Posté le 24-02-2006 à 07:42:55    

Taz a écrit :

si je résume, on a de la branlette parce que ça veut pas faire un new[]


 
?  :heink:  
 
Je ne vois pas trop le rapport, je pense surtout qu'il y a un probleme avec la méthode varg, car sans ça, mon truc marche ... va falloir que je trouve autre chose :/


---------------
Pier noir la mèr - La chanson par HFR Band - Topic TrueCrypt
Reply

Marsh Posté le 24-02-2006 à 09:15:44    

Citation :


Créer un groupe à partir de figures ... mais on ne sait pas combien !


 
ouais...  t'es pas obliger de contruire l'objet en 1 seule instruction !
 
tu crée un objet Groupe(), et apres du fais des ajouteForme(..la forme..) dessus, comme le dis skelter.
Je suppose que tu as un tableau qui contient le nom des formes a ajouter quand tu parses la ligne de commande.
C'est de la bidouille les parametres variables...  :pfff:

Reply

Marsh Posté le 24-02-2006 à 12:24:02    

Je vais essayer, ouais .. C'est ce que j'ai pensé faire :)
Merci !


---------------
Pier noir la mèr - La chanson par HFR Band - Topic TrueCrypt
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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