1 votes

Erreur de compilation avec la fonction const

Je ne sais pas si je rate quelque chose de fondamental. Mais je ne parviens pas à comprendre pourquoi le compilateur génère l'erreur pour ce code :

class A
{
};

class B
{
public:
    B();
    A* get() const;

private:
    A* m_p;
};

B::B()
{
    m_p = new A;
}

A* B::get() const
{
    //This is compiling fine
    return m_p;
}

class C
{
public:
    A* get() const;
private:
    A m_a;
};

A* C::get() const
{
   //Compiler generates an error for this. Why? 
    return &m_a;
}

EDIT : L'erreur du compilateur est : error C2440 : 'return' : cannot convert from 'const class A *' to 'class A *' La conversion perd les qualificatifs.

0voto

A* C::get() const
{
   //Compiler generates an error for this. Why? 
    return &m_a;
}

Comme get() est une fonction const, le compilateur traite toutes les variables membres auxquelles il fait référence comme const. Lorsque vous prenez l'adresse d'un tel membre, vous obtenez un pointeur sur const. Mais votre fonction retourne un pointeur non-const. Vous devez modifier votre code pour

const A* C::get() const
{
    return &m_a;
}

0voto

Daniel Points 225

En gros, il suffit d'ajouter un const devant,

const A* C::get() const
{
   //Compiler generates an error for this. Why? 
    return &m_a;
}

Ensuite, si vous voulez y accéder, faites-le :

C something;

const A* a = something.get();

Cependant, votre programme n'a pas beaucoup de sens, selon moi.

IMO, ce serait le plus logique à faire :

class A{
};

class C : public A
{
};

De cette façon, vous n'avez pas besoin de faire un "get" qui renvoie l'instance de A.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X