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

Langage C++ Discussion :

Les const et les pointeurs, un mauvais mélange ?


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2011
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 51
    Par défaut Les const et les pointeurs, un mauvais mélange ?
    Bonjour,
    J'essaye de mettre en place un pointeur dont ce sur quoi il pointe est constant. Voici la méthode d'une de mes classes (UnitModel) qui retourne ce fameux pointeur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    WeaponModel const * UnitModel::getWeaponModel(size_t index)
    {
        if(index < m_weapon_models.size())
            return m_weapon_models[index];
        else
            return 0;
    }
    J'appelle cette méthode dans un constructeur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    UnitInstance::UnitInstance(UnitModel const * model) : m_model(model)
    {
        for(size_t i = 0; i<m_weapons.size(); ++i)
        {
            WeaponModel const * weaponmodel = m_model->getWeaponModel(i);
     
            if(weaponmodel != 0)
                m_weapons[i] = new WeaponInstance(weaponmodel);
            else
                m_weapons[i] = 0;
        }
    }
    Cependant, lors de la compilation, je rencontre le message d'erreur suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    C:\Users\Romain\Documents\Projets\Tankontrol\UnitInstance.cpp||In constructor 'UnitInstance::UnitInstance(const UnitModel*)':|
    C:\Users\Romain\Documents\Projets\Tankontrol\UnitInstance.cpp|13|error: passing 'const UnitModel' as 'this' argument of 'const WeaponModel* UnitModel::getWeaponModel(size_t)' discards qualifiers|
    ||=== Build finished: 1 errors, 0 warnings (0 minutes, 1 seconds) ===|
    La ligne 13 correspond ici à la ligne 5 du second extrait de code (le constructeur).

    J'ai lu sur différents forums que cette erreur était relative au const (tentative de modifier un objet constant notamment) mais je ne vois pas l'erreur dans mon code.

    Des idées ?

    Merci d'avance,
    darkrojo.

  2. #2
    Membre du Club Avatar de Krell
    Profil pro
    Ingénieur intégration
    Inscrit en
    Juin 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2011
    Messages : 9
    Par défaut
    Avec les const et le pointeurs il y a parfois des subtilité selon si tu veux que ce soit un pointeur constant ou bien que ce soit la donné pointé qui sont constante.



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WeaponModel const * weaponmodel = m_model->getWeaponModel(i);
    m_model c'est le super-constructeur non ? J'en déduit que ce n'est pas un attribut, tu ne peux donc pas faire appel à cette methode de cette manière.

    Si cette méthode est hérité appel là comme tu appellerai n'importe quel autre méthode ^^

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Février 2011
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 51
    Par défaut
    Citation Envoyé par Krell Voir le message
    m_model c'est le super-constructeur non ? J'en déduit que ce n'est pas un attribut, tu ne peux donc pas faire appel à cette methode de cette manière.
    Mhmm, m_model est un attribut de la classe UnitInstance, voici sa déclaration :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UnitModel const * m_model;
    Je n'ai pas compris ce que tu appelais super-constructeur

  4. #4
    Membre du Club Avatar de Krell
    Profil pro
    Ingénieur intégration
    Inscrit en
    Juin 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2011
    Messages : 9
    Par défaut
    Le super-constructeur c'est ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    UnitInstance::UnitInstance(UnitModel const * model) : m_model(model)
    UnitInstance c'est le constructeur, mais à la fin on voit que tu fais un appel de constructeur explicite m_model(model).

    En d'autre terme UnitInstance hérite de m_model et tu passe model au parametre du constructeur de la classe mère.

    Ensuite avoir une classe qui porte le même nom qu'un attribut ce n'est pas une trés bonne idée :s
    Essaye de changer le nom de l'attribut, peut être que le compilateur y trouvera son compte .

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Février 2011
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 51
    Par défaut
    Non non, UnitInstance et UnitModel n'ont aucunes relations d'héritage hein !

    La ligne "d'appel au constructeur de m_model" c'est juste que je transmet la valeur du pointeur fourni en paramètre (m_model) à l'attribut de la classe m_model. Je suis quasiment sur que le problème viens des const comme j'ai pu le voir sur d'autres forums.

  6. #6
    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,
    Citation Envoyé par Krell Voir le message
    Le super-constructeur c'est ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    UnitInstance::UnitInstance(UnitModel const * model) : m_model(model)
    UnitInstance c'est le constructeur, mais à la fin on voit que tu fais un appel de constructeur explicite m_model(model).

    En d'autre terme UnitInstance hérite de m_model et tu passe model au parametre du constructeur de la classe mère.

    Ensuite avoir une classe qui porte le même nom qu'un attribut ce n'est pas une trés bonne idée :s
    Essaye de changer le nom de l'attribut, peut être que le compilateur y trouvera son compte .
    Où vois tu que la classe porte le même nom que l'attribut La classe en question est UnitModel, l'instance passée (enfin le pointeur passé en argument) s'appelle model, et l'attribut s'appelle m_model...

    Par contre, ce qui se passe, c'est que weaponmodel est un pointeur sur une instance constante de WeaponModel.

    Tu ne peux donc invoquer que des fonctions membres de WeaponModel qui soient constantes

    La signature de getWeaponModel() ne devrait donc pas être
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WeaponModel const * getWeaponModel(size_t index)
    mais bien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WeaponModel const * getWeaponModel(size_t index) const
    C'est ce qu'essaye de te dire le message du compilateur: si tu appelle getWeaponModel telle qu'elle est déclarée (sous sa forme non constante pour l'instant), tu essaye d'invoquer une fonction qui contrevient au fait que tu t'es engagé à ne pas modifier l'instance au départ de laquelle tu effectue cette tentative (parce que la fonction appelée ne donne aucune garantie de non modification)
    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

  7. #7
    Membre du Club Avatar de Krell
    Profil pro
    Ingénieur intégration
    Inscrit en
    Juin 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2011
    Messages : 9
    Par défaut
    Citation Envoyé par koala01 Voir le message
    Où vois tu que la classe porte le même nom que l'attribut La classe en question est UnitModel, l'instance passée (enfin le pointeur passé en argument) s'appelle model, et l'attribut s'appelle m_model...
    Ligne 5 il y a un m_model->getWeaponModel(i);

    Seulement j'ai prit m_model pour un super-constructeur de classe mère, la prochaine fois je demanderai la déclaration de classe me aculpa

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

Discussions similaires

  1. les consts ou les nombres
    Par Dr walid dans le forum Débuter
    Réponses: 5
    Dernier message: 05/11/2009, 21h44
  2. Réponses: 4
    Dernier message: 11/09/2006, 16h55
  3. Les polices dans les tables et les requêts
    Par zooffy dans le forum Access
    Réponses: 3
    Dernier message: 21/06/2006, 11h06

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