2009-08-06 9 views
3

J'ai un vecteur de pointeurs UnderlyingClass stockés dans un autre objet, et à l'intérieur d'une méthode dans UnderlyingClass je veux ajouter le pointeur "this" à la fin de ce vecteur. Lorsque je regarde le contenu du vecteur immédiatement après l'appel push_back, le mauvais pointeur est là. Qu'est-ce qui pourrait mal tourner?push_back (this) pousse le pointeur erroné sur le vecteur

cout << "this: " << this << endl; 
aTextBox.callbacks.push_back(this); 
cout << "size is " << aTextBox.callbacks.size() << endl; 
cout << "size-1: " << aTextBox.callbacks[aTextBox.callbacks.size()-1] << endl; 
cout << "back: " << aTextBox.callbacks.back() << endl; 
cout << "0: " << aTextBox.callbacks[0] << endl; 
cout << "this: " << this << endl; 
cout << "text box ptr: " << &aTextBox << endl; 
cout << "text box callbacks ptr: " << &(aTextBox.callbacks) << endl; 

est ici la sortie:

this: 0x11038f70 
size is 1 
size-1: 0x11038fa8 
back: 0x11038fa8 
0: 0x11038fa8 
this: 0x11038f70 
text box ptr: 0x11039070 
text box callbacks ptr: 0x11039098 

Par ailleurs, callbacks est un vecteur de pointeurs web call back, et UnderlyingClass implémente web call back:

std::vector<WebCallback*> callbacks; 


class UnderlyingClass 
    :public WebCallback 

Copié des commentaires: (voir réponse ci-dessous

sortie:

this: 0x6359f70 
size is 1 
size-1: 0x6359fa8 
back: 0x6359fa8 
0: 0x6359fa8 
this: 0x6359f70 
WebCallback This: 0x6359fa8 
text box ptr: 0x635a070 
text box callbacks ptr: 0x635a098 

ok, cela explique pourquoi les pointeurs ne correspondent pas.

Ma vraie question est donc celle-ci:

comment puis-je obtenir la version correcte d'une méthode à appeler? Plus précisément, WebCallback stipule qu'une fonction onWebCommand() doit être implémentée, et maintenant les callbacks [0] -> onWebCommand() ne provoquent pas l'exécution de onWebCommand() que j'ai écrite dans UnderlyingClass.

+1

Cela ressemble sûrement à l'héritage multiple. –

+0

UnderlyingClass a-t-il d'autres classes de base? –

+1

Dagnammit. C'est la deuxième fois aujourd'hui que litb m'a battu exactement 47 secondes. Je suis comme un quart de seconde plus proche des Etats-Unis que lui, je devrais gagner ces derniers! –

Répondre

8

Cela peut se produire avec l'héritage multiple, si votre mise en page ressemble à ceci:

class UnderlyingBase { 
    char d[56]; 
}; 

class UnderlyingClass 
    :public UnderlyingBase, 
    public WebCallback { 

}; 

Ensuite, la mise en page peut être comme celui-ci, pour chaque objet concerné. Le dernier est l'objet complet contenant les deux premiers en tant que sous-objets de classe de base, et que vous prenez le pointeur de, et qui sera converti en WebCallback*.

[UnderlyingBase] 
> char[56]: 56 bytes, offset 0x0 

[WebCallback] 
> unknown: x bytes, offset 0x0 

[UnderlyingClass] 
> [UnderlyingBase]: 56 bytes (0x38 hex), offset 0x0 
> [WebCallback]: x bytes, offset 0x38 

Maintenant, puisque votre vecteur contient WebCallback*, le compilateur ajuste le pointeur pour pointer vers le sous-objet WebCallback, alors que quand il citerais UnderlyingClass ou UnderlyingBase, il commencerait 0x38 (56) octets plus tôt.

+0

Ah, c'est logique. Donc, cette question est née de ma tentative de déboguer un autre problème; est l'héritage multiple au travail sur le plus gros problème? En particulier, WebCallback a une méthode virtuelle onWebCommand(), qui est bien sûr implémentée dans UnderlyingClass, et une autre partie dans le code que j'appelle onWebCommand() sur chacun des membres des callbacks. À l'heure actuelle, ce code pour UnderlyingClass :: onWebCommand() n'est pas en cours d'exécution; Qu'est-ce qui ne va pas? – unsorted

+0

Cela devrait fonctionner. vérifier si les deux méthodes ont vraiment la même signature (y compris const-ness). –

+0

en effet, il y avait un problème avec la signature. Merci pour l'aide - bonne explication. – unsorted

3

Ajouter à votre impression sur:

cout << "this: " << this << endl; 
cout << "WebCallback This: " << dynamic_cast<WebCallback*>(this) << endl; 

Je parie que c'est ce que vous recherchez.

+0

sortie: ceci: 0x6359f70 taille est de 1 taille 1: 0x6359fa8 retour: 0x6359fa8 0: 0x6359fa8 ceci: 0x6359f70 web call back Ce: 0x6359fa8 texte boîte PTR: 0x635a070 zone de texte callbacks PTR: 0x635a098 ok , ce qui explique pourquoi les pointeurs ne correspondent pas. Ma vraie question, alors, est la suivante: comment puis-je obtenir la version correcte d'une méthode à appeler? Plus précisément, WebCallback stipule qu'une fonction onWebCommand() doit être implémentée, et maintenant les callbacks [0] -> onWebCommand() ne provoquent pas l'exécution de onWebCommand() que j'ai écrite dans UnderlyingClass. – unsorted

+0

Ajouter à votre question la définition de WebCallback AND UnderlyingClass. Je parie que votre définition de la méthode virale n'est pas correcte. –

+0

d'oh, la méthode avait la mauvaise signature (constness) et un assert (faux) que j'ai mis dans la version de l'interface de la méthode n'était pas touché car les assertions n'étaient pas activées dans ma session gdb. Merci pour l'aide! – unsorted

Questions connexes