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 :

Comment gérer differents objets de la meme maniere


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8
    Par défaut Comment gérer differents objets de la meme maniere
    Bonjour,

    J'aimerais savoir comment faire pour utiliser deux objets différents stoké dans une queue à partir d'un meme pointeur. De maniere propre et portable.

    J'utilise actuellement l'heritage, mais le probleme est que les deux objet doivent posséder les meme membres, celon ce que m'indique mon compilateur...

    Merci.

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Personnellement j'ai rien compris. Un petit exemple peut-être ?

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 125
    Par défaut
    Oui il faut que tu ai une classe d'interface


    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
     
    class A
    {
    virtual  void f()=0;   //virtual permet l'appel de la version spécialisé de B ou C
    };
     
    class B : public A
    {
    void f(){ cout <<"B::f()"<<endl;};
    };
     
    class C : public A
    {
    void f(){ cout <<"C::f()"<<endl;};
    };
    ce qui te permet de faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    list<A*> malist;
    list<A*> ::iterator it;
     
    malist.push_back(new B());
    malist.push_back(new C());
     
    for(it=malist.begin(); it != malist.end();++it)
    (*it)->f();

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8
    Par défaut
    Oui il faut que tu ai une classe d'interface
    Oui c'est cette méthode que j'utilise pour le moment mais elle oublige les objet B et C d'avoir les mêmes fonctions d'interface deffinit dans A, le probleme est que mes deux objets n'ont pas la meme interface.

    En réalité je souhaite stocké dans une queue une expression mathématique précédament transformé en Notation polonaise inverse.

    Ainsi
    - un nombre peut etre additionner pas un opérateur
    - un opérateur possède une priorité pas un nombre etc ...

    N'y-t-il pas un autre moyen, ou peut etre faut-il repenser la conception ? ...

    Merci

  5. #5
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    On ne peut effectivement pas additionner un opérateur ou donner une priorité à un nombre.

    En général, pour ce genre de structure :
    - soit on considère les "tokens", c'est à dire les représentation en chaîne de caractère des blocs élémentaires de l'expression mathématique, et dans ce cas là, il n'est pas forcément important de différentier les objets en plusieurs classes, et en tout cas des notions comme additionner ou priorité n'ont pas encore de sens,

    - soit on considère des expressions mathématiques, un nombre pouvant en être une, mais aussi un opérateur avec ses opérandes (lesquelles sont d'ailleurs elles aussi des opérations mathémmatiques. Apparaîssent alors des propriétés communes à toutes les catégories d'expression, comme la possibilité d'être évaluées, que l'on peut mettre dans une classe de base.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 125
    Par défaut
    bin tu peux toujours avoir une methode qui retourne le type
    et en fonction de ce type faire un cast en B* ou C*

    mais tu as peut etre un pb de modelisation

    tu peux avoir une interface avec une methode commune
    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
     
    class A  //interface
    {
    virtual double valeur()=0;
    };
     
    class add :public A// operateur
    {
    virtual double valeur(){ return left.valeur()+right.valeur();};
    };
     
    class sub :public A// operateur
    {
    virtual double valeur(){ return left.valeur()-right.valeur();};
    };
     
    class nb :public A
    {
    double nb;
    virtual double valeur(){ return nb;};
    };

    ainsi chaques élémenents a une valeur la valeur de l'operation est bien le resultat de la valo de tes 2 operandes.

Discussions similaires

  1. [Web Services] Spring MVC : Differents XML d'un meme objet
    Par Deaimel dans le forum Spring
    Réponses: 3
    Dernier message: 18/06/2011, 10h26
  2. Réponses: 13
    Dernier message: 25/05/2010, 07h44
  3. Comment gérer le style d'un objet créé dynamiquement
    Par Delphi-ne dans le forum ASP.NET
    Réponses: 3
    Dernier message: 05/02/2008, 16h12
  4. Réponses: 9
    Dernier message: 30/03/2006, 20h16
  5. Comment gérer un nombre inconnu d'objet ?
    Par Clad3 dans le forum C++
    Réponses: 28
    Dernier message: 12/03/2005, 11h55

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