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 :

Problème de Cross-Casting


Sujet :

C++

  1. #1
    Membre chevronné Avatar de Jbx 2.0b
    Homme Profil pro
    Développeur C++/3D
    Inscrit en
    Septembre 2002
    Messages
    476
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur C++/3D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2002
    Messages : 476
    Points : 1 785
    Points
    1 785
    Par défaut Problème de Cross-Casting
    Bonjour,

    J'ai un petit problème de cross-casting

    J'ai les classes de base suivantes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    class A
    {
    public:
        A(void) : name("No name"){} 
        virtual ~A(void) {}
     
        virtual void setName(const QString& name) { this->name = name;}
        virtual QString getName() const                { return name;}
        [...]
    private:
        QString name;
    };

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    class B
    {
    public:
        B(void){} 
        virtual ~B(void) {}
     
        [...]
    };

    Et une classe C, D, E héritant à la fois de A et B
    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
     
    class C : public A, public B
    {
    public:
        C(void){} 
        virtual ~C(void) {}
     
        [...]
    };
     
    class D : public A, public B
    {
    public:
        D(void){} 
        virtual ~D(void) {}
     
        [...]
    };
     
    etc..

    Dans une autre classe j'ai une QList de B*. J'y place uniquement des C*, D* et E*, par polymorphisme :

    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
     
    QList<B*> liste;
    liste.append(new C);
    liste.append(new D);
    liste.append(new E);
    [...]
     
    // je récupère le premier élément :
    QList<B*>::const_iterator i = itemsList.constBegin();
    if( i != itemsList.constEnd() )
    {
    	// et je tente un cross-casting
            A* select = dynamic_cast<A* >(*i);
    	//Prochaine ligne : BOOM !
            selected->getName();
    }
    Voilà bien-sur j'ai quelques hypothèses:
    1) je fais n'importe quoi, je n'ai pas le droit de faire ça et il y a un problème de conception latent dans mon projet (pourtant ça ressemble sacrément à ça quand même).
    2) name n'est jamais initialisé. Mais pourqui pourquoi je n'en est aucune idée
    3) euh c'est tout en fait

  2. #2
    Membre éprouvé
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Points : 1 220
    Points
    1 220
    Par défaut
    On peut voir l'erreur à la compilation (à moins que ce soit une runtime error, auquel cas, ça veut dire que B n'a pas de méthode getName())

    Note: en regardant mieux, B n'a pas l'air d'avoir de méthode getname, je vois pas pourquoi ça marcherais: même si tu cast, la méthode appelée par une fonction virtuelle est censée être celle du type réel du pointeur (la virtualité sert à ça ). donc çane peut pas marcher.

    Bonne chance pour la suite
    Méphistophélès
    Si la solution ne résout pas votre problème, changez le problème...
    Cours et tutoriels C++ - FAQ C++ - Forum C++.

  3. #3
    Membre chevronné Avatar de Jbx 2.0b
    Homme Profil pro
    Développeur C++/3D
    Inscrit en
    Septembre 2002
    Messages
    476
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur C++/3D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2002
    Messages : 476
    Points : 1 785
    Points
    1 785
    Par défaut
    Ce qui me place dans le cas n°1 (je m'en doutais un peu )
    Du coup je ne vois plus trop l'intérêt du cross-casting si c'est pour dupliquer des méthodes...
    Je me demande bien comment j'vais m'en sortir, à part avec un vilain map, ou peut être en créant une classe intermédiaire.

  4. #4
    Membre éprouvé
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Points : 1 220
    Points
    1 220
    Par défaut
    si tu nous disais ce que tu veux faire ce serait plus facile.

    Si tu veux juste que getName soit exécutée, il faut simplement ne pas mettre la fonction en virtual (mais il faut être sûr que celle-ci s'applique à n'importe quel type de donnée).

    D'ailleurs, on déconseille les fonctions publiques virtuelles.


    Bonne chance
    Méphistophélès
    Si la solution ne résout pas votre problème, changez le problème...
    Cours et tutoriels C++ - FAQ C++ - Forum C++.

  5. #5
    Membre chevronné Avatar de Jbx 2.0b
    Homme Profil pro
    Développeur C++/3D
    Inscrit en
    Septembre 2002
    Messages
    476
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur C++/3D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2002
    Messages : 476
    Points : 1 785
    Points
    1 785
    Par défaut
    Effectivement il devait y avoir un problème à ce niveau là. Ça fonctionne maintenant.
    Ce que j'essaye de faire est assez difficile à expliquer, mais en gros je manipule des objets fondés sur QGraphicsItem et les classes qui en héritent, avec la volonté d'ajouter d'autres services à ces classes par l'intermédiaire d'une classe abstraite.
    La classe QGraphicsScene elle ne stocke que des QGraphicsItem. J'avais besoin de récupérer les objets pointés par la souris et d'appliquer un service ajouté.

    Bref, c'est assez compliqué (et un peu hors sujet du C++ pur), d'habitude je m'efforce de bien expliquer ce que je fais/essaye de faire mais dans ce cas particulier ça m'est assez difficile(et je manque de temps ! ).

    En tout cas un grand merci à toi pour ton aide précieuse !

  6. #6
    Membre éprouvé
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Points : 1 220
    Points
    1 220
    Par défaut
    De rien.


    Et n'oublie pas le tag juste en dessous


    Je ne suis pas assez calé en Qt pour comprendre de quoi tu parle, mais bonne chance pour la suite.
    Méphistophélès
    Si la solution ne résout pas votre problème, changez le problème...
    Cours et tutoriels C++ - FAQ C++ - Forum C++.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. problème avec Class.cast
    Par touftouf57 dans le forum Langage
    Réponses: 1
    Dernier message: 29/03/2009, 04h07
  2. Problème de dynamic casting
    Par Colbix dans le forum C++
    Réponses: 5
    Dernier message: 25/03/2009, 17h55
  3. [LabVIEW 6.1] Problème de type cast
    Par ¤Dany¤ dans le forum LabVIEW
    Réponses: 3
    Dernier message: 23/10/2008, 21h06
  4. problème avec des cast
    Par deubelte dans le forum C++
    Réponses: 3
    Dernier message: 26/02/2007, 18h11

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