IdentifiantMot de passe
Loading...
Mot de passe oubli� ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les r�ponses en temps r�el, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

surcharge et collection h�t�rog�ne


Sujet :

C++

  1. #1
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    2
    D�tails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2008
    Messages : 2
    Par d�faut surcharge et collection h�t�rog�ne
    Bonjour � tous,

    Je suis en train d'�crire un programme, et j'ai un petit probl�me avec la surcharge de l'op�rateur << de ma classe h�t�rog�ne

    j'ai une classe h�t�rog�ne d�fini comme suit:

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    class Systeme : public vector<Oscillateur* >
     
    {
     
     
     
    // (...)
     
     
     
     
    public:
     
    //surcharge externe
     
    friend ostream& operator<<(ostream& out, Systeme& obj)
    {
    	out<<"Le systeme est compose de "<<obj.size()+1<<" objet(s) indépendant(s):"<<endl<<endl;
    	for (unsigned int i(0); i<obj.size(); ++i)
     
    	{
     
    		out<<"Oscillateur "<<j<<":"<<endl
     
    		   <<(obj)[i]<<endl<<endl;
     
    	}
     
    	return out;
     
    }
    };
    et un programme de test :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
     
    //  (...)
    int main()
    {
     
     
    	Systeme test;
     
    	Vecteur o1(0.,1.,0.);
    	Vecteur a1(3.,4.,5.);
    	test.push_back(new Ressort (o1, a1, 0.,0., -5., 10., 20., 4.));
     
    	Vecteur o2(2.,5.,4.);
    	Vecteur a2(9.,6.,8.);
    	test.push_back(new Ressort (o2, a2, 0., 0., 6., 70., 10., 27.));
     
    	Vecteur o3(6.,1.,5.);
    	Vecteur a3(6.,4.,75.);
    	test.push_back(new Pendule (o3, a3, 0., 0., -1., 43., 50.));
     
    	cout<<test<<endl;
    	return 0;
    };
    Quand je compile et que je lance le programme, il me donne:
    Le systeme est compose de 5 objet(s) ind�pendant(s):

    Oscillateur 1:
    0x80500c0

    Oscillateur 2:
    0x8050238

    Oscillateur 3:
    0x8050360
    L'erreur vient de toute �vidence de la ligne : Les constructeurs et surcharge externe des classes Vecteur, Oscillateur, Ressort, Pendule �tant corrects (j'ai des programmes de test rien que pour eux ), �a ne peut venir que de l�, mais je ne comprend pas comment faire comprendre qu'il faut utiliser l'op�rateur de sortie de Ressort (si la i-�me ligne est un ressort) et pas un autre.

    Quelqu'un peut m'aider? �a fait plusieurs heures que je susi dessus, et l�, m�me apr�s pas mal de recherches sur le web, je ne trouve rien.

    (Note: le destructeur s'occupe de lib�rer la m�moire demand�e par les new)

  2. #2
    Membre confirm�
    Inscrit en
    Avril 2008
    Messages
    95
    D�tails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 95
    Par d�faut
    Salut,

    Peux-tu nous mettre la surcharge de tes operateurs << pour Ressort et Pendule.

    Pourquoi dans ton main as-tu
    Le systeme est compose de 5 objet(s) ind�pendant(s):
    ? Il devrait indiquer 4 : 3 objets dans ta lise (.size()) + 1 comme dans ton code :/

  3. #3
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    2
    D�tails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2008
    Messages : 2
    Par d�faut
    Pour le 5 objets, c'est parce que j'ai supprim� quelques objets de la collection, pour rendre moins long le code.

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
     
    //SURCHAGE RESSORT
    friend ostream& operator<<(ostream& out, Ressort& obj)
    {
    	out<<"Ressort"<<endl
    	   <<"Vecteur Omega (parametre): "<<obj.omega<<endl
    	   <<"Vecteur vitesse (derivee d'omega): "<<obj.vitesse<<endl
    	   <<"Masse (m): "<<obj.m<<endl
    	   <<"constante du ressort (k): "<<obj.k<<endl
    	   <<"Frottement (fluide) (b): "<<obj.b<<endl
    	   <<"longueur au repos: "<<obj.L<<endl
    	   <<"Origine du pendule (O): "<<obj.O<<endl
    	   <<"Axe (a): "<<obj.a<<endl;
    	return out;
    }
    //SURCHARGE PENDULE
     
    friend ostream& operator<<(ostream& out, Pendule&  obj)
    {
    	out<<"Ressort"<<endl
    	   <<"Vecteur Omega (parametre): "<<obj.omega<<endl
    	   <<"Vecteur vitesse (derivee d'omega): "<<obj.vitesse<<endl
    	   <<"Masse (m): "<<obj.m<<endl
    	   <<"Longueur (L): "<<obj.L<<endl
    	   <<"Frottement (fluide) (b): "<<obj.b<<endl
    	   <<"Origine du pendule (O): "<<obj.O<<endl
    	   <<"Axe (a): "<<obj.a<<endl;
    	return out;
    }

  4. #4
    Membre confirm�
    Inscrit en
    Avril 2008
    Messages
    95
    D�tails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 95
    Par d�faut
    Dans ton vecteur "Systeme" tu stockes des pointeurs :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    class Systeme : public vector<Oscillateur* >
    Donc dans ton Systeme tu as des pointeurs :
    obj[0] = 0x80500c0
    obj[1] = 0x8050238
    obj[2] = 0x8050360
    selon ton exemple, et ainsi de suite.
    Aussi, pour utiliser l'operateur "<<" appartenant a tes classes Ressort et Pendule, il te faut faire :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    out << etc << *(out[i]) << etc ...
    Cependant Systeme contenant des objets de type Oscillateur, j'ai bien peur que *(out[i]) ne renvoie justement un objet de type Oscillateur :/ A tester.

  5. #5
    R�dacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supa�ro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activit� : Ing Supa�ro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Par d�faut
    Cependant Systeme contenant des objets de type Oscillateur, j'ai bien peur que *(out[i]) ne renvoie justement un objet de type Oscillateur :/ A tester.
    C'est ce qui va arriver et ?
    Il suffit d'appliquer ce qui est dit dans la FAQ, (ici), � savoir une m�thode d'affichage polymorphique.
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une tr�s bonne doc sur le C++ (en) Why linux is better (fr)

  6. #6
    Membre confirm�
    Inscrit en
    Avril 2008
    Messages
    95
    D�tails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 95
    Par d�faut
    Par exemple oui. D'o� le "� tester"

  7. #7
    Expert �minent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activit� : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par d�faut
    Salut,

    De mani�re g�n�rale, il n'est la plupart du temps d�j� pas vraiment conseill� de faire un h�ritage des classes de la S(T)L...

    Le fait qu'il s'agit, dans une grande majorit� des cas, de classe template (ou de sp�cialisation de classe template), et par cons�quent, que les m�thodes (et principalement le destructeurs) ne peuvent pas �tre virtuelles y est pour beaucoup.

    De plus, il faut bien comprendre que l'h�ritage est la liaison la plus forte qui puisse exister entre deux classes, et que, tr�s souvent, il est pr�f�rable d'envisager une association (ou une agr�gation) � un h�ritage.

    Ainsi, l'h�ritage devrait �tre r�serv� si tu peux r�pondre par l'affirmative � deux questions:
    • peux tu r�ellement dire que (ici) ta classe system est un tableau de pointeurs vers des �l�ments de type Oscillateur
    • Peux tu r�ellement estimer que ta classe System a toutes les caract�ristiques d'un tableau de pointeur vers des �l�ments de type Oscilliateur et que le fait de lui supprimer ces caract�ristiques rend l'existence du syst�me impossible

    Pour ma part, j'aurais tendance � r�pondre par la n�gative � ces deux questions:
    • S�mantiquement parlant, un syst�me est un ensemble qui regroupe plusieurs �l�ments (�ventuellement des pointeurs sur des objet de type Oscillateur, mais pas seulement).
    • Si tu supprimes les pointeurs sur les objets de type Oscillateur, tu ne permet sans doute plus � ton objet de type System de rendre tous les services que tu attend de lui, mais tu n'en emp�che pas l'existence.
    Tout cela pour dire que, � mon sens, ta classe syst�me devrait �tre une association (ou une agr�gation, selon le fait qu'un oscillateur puisse ou non exister en dehors du syst�me) de pointeurs sur Oscilliateur, et cela, m�me si cela n�cessite, pour permettre � ta classe System de rendre tous les services que tu attend d'elle, de d�finir des m�thodes qui ne feront... qu'appeler des m�thodes de la classe vector.

    Cela ne r�pond pas, je m'en rend compte � ta question de base (mais la r�ponse a bel et bien �t� donn�e ) , mais il me semblait malgr� tout opportun de faire cette piqure de rappel du point de vue de la conception
    A m�diter: La solution la plus simple est toujours la moins compliqu�e
    Ce qui se con�oit bien s'�nonce clairement, et les mots pour le dire vous viennent ais�ment. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 f�vrier 2014
    mon tout nouveau blog

Discussions similaires

  1. Polymorphisme : collection h�t�rog�ne s�lective
    Par dasycarpum dans le forum D�buter
    R�ponses: 7
    Dernier message: 26/05/2015, 18h32
  2. Probl�me de tri sur collection d'enfants h�t�rog�nes
    Par touftouf57 dans le forum XSL/XSLT/XPATH
    R�ponses: 1
    Dernier message: 04/02/2013, 01h21
  3. Comment cr��r une collection sous Delphi
    Par PsyKroPack dans le forum Langage
    R�ponses: 6
    Dernier message: 11/02/2003, 13h20
  4. [VB6] Modifier la clé d'un élément d'une collection
    Par Ricou13 dans le forum VB 6 et ant�rieur
    R�ponses: 3
    Dernier message: 21/11/2002, 14h49
  5. R�ponses: 8
    Dernier message: 20/11/2002, 11h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo