2010-07-15 6 views
4

Quelqu'un peut-il me dire pourquoi je reçois cette erreur lors du remplissage de cette classe?Impossible de convertir le pointeur 'this' en classe &

class C 
{ 
public: 
    void func(const C &obj) 
    { 
     //body 
    } 

private: 
    int x; 
}; 

void func2(const C &obj) 
{ 
    obj.func(obj); 
} 

int main() { /*no code here yet*/} 

Répondre

11

Le C :: méthode func() ne garantit pas qu'il ne modifiera pas l'objet, il promet seulement qu'il ne modifiera pas son argument. Correction:

void func(const C &obj) const 
    { 
     // don't change any this members or the compiler complains 
    } 

Ou en faire une fonction statique. Ce qui sonne comme il devrait l'être quand il prend un objet C comme argument.

+0

Bonne réponse. Essayer de rendre le point encore plus clair: Puisque 'func2' prend un' const C & '(c'est-à-dire une référence à un' const C'), cela signifie que la fonction ne peut pas modifier cette instance d'objet. Cette contrainte est transmise à la fonction membre appelée 'C :: func': elle ne devrait pas modifier l'instance de l'objet; donc le 'const' requis dans la déclaration. – stakx

+0

Ok, mais pourquoi dit-on ne peut pas convertir en C &? – Drew

+0

Ce n'est pas un grand message d'erreur. Mon compilateur dit "Impossible de convertir 'ce' pointeur de 'const C' en 'C &'". Ce qui ne gagne pas de prix peut-être, mais fait bien comprendre qu'un problème de correction de const est le problème. –

2

Vous devez marquer C::func(const C &obj) comme const comme vous l'appelez à partir d'un objet const. La signature correcte ressemblerait à ceci:

void func(const C& obj) const 
1

Le problème est que dans func2() vous appelez une fonction non-const (C::func()) à l'aide d'un objet const.

Modifier la signature de C::func() à:

void func(const C &obj) const 
{ 
    // whatever... 
} 

afin qu'il puisse être appelé avec des objets const.

1

Parce que:

this 

est un pointeur const à obj courant.

Par conséquent, vous pouvez soit faire la fonc soit const:

class C 
{ 
public: 
    void func(const C &obj) const 
    { 
     //body 
    } 

private: 
    int x; 
}; 

void func2(const C &obj) 
{ 
    obj.func(obj); 
} 

int main() { 
return 0; 
} 

OU

vous pouvez supprimer le constness du ce pointeur comme ceci:

class C 
{ 
public: 
    void func(const C &obj) 
    { 
     //body 
    } 

private: 
    int x; 
}; 

void func2(const C &obj) 
{ 
    (const_cast<C &>(obj)).func(obj); 
} 

int main() { 
return 0; 
} 

espoir que aide.

Questions connexes