Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1646 connectés 

  FORUM HardWare.fr
  Programmation
  C++

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1308306
ParadoX
Posté le 17-02-2006 à 19:27:34  profilanswer
 

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
mood
Publicité
Posté le 17-02-2006 à 19:27:34  profilanswer
 

n°1308342
skelter
Posté le 17-02-2006 à 20:33:56  profilanswer
 

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

n°1308343
Taz
bisounours-codeur
Posté le 17-02-2006 à 20:36:27  profilanswer
 

c'est de la grosse daube les va_list.

n°1308373
ParadoX
Posté le 17-02-2006 à 21:27:53  profilanswer
 

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
n°1308378
skelter
Posté le 17-02-2006 à 21:34:08  profilanswer
 

ParadoX a écrit :

Push back ? :??:


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

n°1308386
Taz
bisounours-codeur
Posté le 17-02-2006 à 21:50:32  profilanswer
 

std::vector<>

n°1308487
ParadoX
Posté le 18-02-2006 à 08:08:01  profilanswer
 

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
n°1308490
Joel F
Real men use unique_ptr
Posté le 18-02-2006 à 08:59:55  profilanswer
 

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

n°1309098
Riot
Buy me a riot
Posté le 19-02-2006 à 16:30:10  profilanswer
 

Oui mais le monsieur veut utiliser plusieurs objets :o

n°1309130
ParadoX
Posté le 19-02-2006 à 17:36:40  profilanswer
 

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
mood
Publicité
Posté le 19-02-2006 à 17:36:40  profilanswer
 

n°1309132
Taz
bisounours-codeur
Posté le 19-02-2006 à 17:41:11  profilanswer
 

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

n°1309134
ParadoX
Posté le 19-02-2006 à 17:45:56  profilanswer
 

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
n°1309141
Flaie
No it's necessary
Posté le 19-02-2006 à 18:04:09  profilanswer
 

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..

n°1309146
ParadoX
Posté le 19-02-2006 à 18:13:08  profilanswer
 

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
n°1309149
Flaie
No it's necessary
Posté le 19-02-2006 à 18:22:35  profilanswer
 

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
n°1309151
Taz
bisounours-codeur
Posté le 19-02-2006 à 18:26:27  profilanswer
 

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

n°1309156
Flaie
No it's necessary
Posté le 19-02-2006 à 18:31:06  profilanswer
 

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

n°1309195
ParadoX
Posté le 19-02-2006 à 19:03:28  profilanswer
 
n°1309196
el muchach​o
Comfortably Numb
Posté le 19-02-2006 à 19:03:36  profilanswer
 

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
n°1309198
ParadoX
Posté le 19-02-2006 à 19:05:18  profilanswer
 

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
n°1309207
el muchach​o
Comfortably Numb
Posté le 19-02-2006 à 19:09:42  profilanswer
 

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
n°1309211
chrisbk
-
Posté le 19-02-2006 à 19:10:48  profilanswer
 

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

n°1309221
ParadoX
Posté le 19-02-2006 à 19:14:13  profilanswer
 

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
n°1309222
el muchach​o
Comfortably Numb
Posté le 19-02-2006 à 19:14:26  profilanswer
 

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.

n°1309224
Flaie
No it's necessary
Posté le 19-02-2006 à 19:18:23  profilanswer
 

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!
n°1309251
slash33
Posté le 19-02-2006 à 19:58:39  profilanswer
 

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
n°1309300
ParadoX
Posté le 19-02-2006 à 20:43:56  profilanswer
 
n°1311801
ParadoX
Posté le 22-02-2006 à 20:13:28  profilanswer
 

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
n°1311891
slash33
Posté le 22-02-2006 à 23:08:55  profilanswer
 

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

n°1311942
ParadoX
Posté le 23-02-2006 à 01:12:39  profilanswer
 

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
n°1312142
ChristianS​_
Posté le 23-02-2006 à 13:23:10  profilanswer
 

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

n°1312457
ParadoX
Posté le 23-02-2006 à 16:56:23  profilanswer
 

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
n°1312489
skelter
Posté le 23-02-2006 à 17:30:24  profilanswer
 

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)

n°1312509
ParadoX
Posté le 23-02-2006 à 18:01:13  profilanswer
 

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
n°1312556
nargy
Posté le 23-02-2006 à 18:41:54  profilanswer
 

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();
 
 
 

n°1312562
skelter
Posté le 23-02-2006 à 18:45:05  profilanswer
 

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

n°1312630
Taz
bisounours-codeur
Posté le 23-02-2006 à 20:48:54  profilanswer
 

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

n°1312797
ParadoX
Posté le 24-02-2006 à 07:42:55  profilanswer
 

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
n°1312831
ChristianS​_
Posté le 24-02-2006 à 09:15:44  profilanswer
 

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:

n°1312922
ParadoX
Posté le 24-02-2006 à 12:24:02  profilanswer
 

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
mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

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

 

Sujets relatifs
résolu Problème de concaténation de variable[resolu] Liste dynamiques liées, pb de récupération de variable
Petit problème en C... compteur par rapport à un nombre de joursEst ce que l'on peut faire passer une variable avec un header ?
Expression reguliere dans une variable...passer ds variable dans ds metas
[C++ débutant] Const_cast ? :-(déclarer variable
[Débutant] Socketsi la valeur d'une variable existe deja
Plus de sujets relatifs à : [C++ débutant]Constructeur prenant un nombre de paramètres variable ?


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR