2009-08-06 9 views
3

Ich habe einen Vektor der UnderlyingClass Zeiger in einem anderen Objekt gespeichert, und innerhalb einer Methode in UnderlyingClass möchte ich den "this" Zeiger an das Ende des Vektors hinzufügen. Wenn ich den Inhalt des Vektors unmittelbar nach dem Aufruf von push_back anschaue, ist der falsche Zeiger dort. Was könnte schief gehen?push_back (this) schiebt falschen Zeiger auf Vektor

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; 

Hier ist der Ausgang:

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

By the way, ist Rückrufe ein Vektor von WebCallback Zeiger und UnderlyingClass implementiert WebCallback:

std::vector<WebCallback*> callbacks; 


class UnderlyingClass 
    :public WebCallback 

von Kommentaren Kopierte: (siehe unten Antwort)

Ausgabe:

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 

okay, so dass erklärt, warum die Zeiger nicht übereinstimmen.

Meine eigentliche Frage, dann ist dies:

wie kann ich die richtige Version eines Verfahrens aufgerufen werden bekommen? Insbesondere schreibt WebCallback vor, dass eine Funktion auf WebCommand() implementiert werden soll, und Callbacks [0] -> onWebCommand() bewirkt derzeit nicht, dass der onWebCommand(), den ich in UnderlyingClass geschrieben habe, ausgeführt wird.

+1

Das klingt sicherlich wie Mehrfachvererbung. –

+0

Hat UnderlyingClass andere Basisklassen? –

+1

Dagnammit. Das ist schon das zweite Mal, dass Litb mich um genau 47 Sekunden geschlagen hat. Ich bin wie eine viertel Lichtsekunde näher an den USA als er, ich sollte diese gewinnen! –

Antwort

8

mit Mehrfachvererbung passiert Dies kann, wenn Ihr Layout wie folgt aussieht:

class UnderlyingBase { 
    char d[56]; 
}; 

class UnderlyingClass 
    :public UnderlyingBase, 
    public WebCallback { 

}; 

Dann kann das Layout so sein, beteiligte für jedes Objekt. Der letzte ist das komplette Objekt, das die ersten beiden als Unterobjekte der Basisklasse enthält, den Sie als Zeiger verwenden und in konvertieren.

[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 

Nun, da Ihr Vektor WebCallback* enthält, paßt der Compiler den Zeiger auf das WebCallback Unter Objekt zu zeigen, während, wenn es um UnderlyingClass oder UnderlyingBase zeigen würde, wäre es 0x38 (56) früher beginnen Bytes.

+0

Ah, das macht Sinn. So entstand diese Frage von mir versucht, ein anderes Problem zu debuggen; ist die Mehrfachvererbung bei der Arbeit am größeren Problem? Insbesondere WebCallback hat eine virtuelle Methode auf WebCommand(), die natürlich in UnderlyingClass implementiert ist, und an einem anderen Teil im Code ich auf WebBefehl() auf jedem der Mitglieder von Callbacks aufrufen. Im Moment wird dieser Code für UnderlyingClass :: onWebCommand() nicht ausgeführt; Was ist los mit dir? – unsorted

+0

Das sollte funktionieren. Überprüfen Sie, ob beide Methoden wirklich die gleiche Signatur haben (einschließlich const-ness). –

+0

tatsächlich gab es ein Problem mit der Signatur. Danke für die Hilfe - großartige Erklärung. – unsorted

3

Fügen Sie diese auf Ihrem Ausdruck:

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

Ich wette, das ist, was Sie suchen.

+0

Ausgabe: dies: 0x6359f70 Größe 1 size-1: 0x6359fa8 zurück: 0x6359fa8 0: 0x6359fa8 dies: 0x6359f70 WebCallback dieses: 0x6359fa8 Textfeld ptr: 0x635a070 Textfeld Rückrufe ptr: 0x635a098 in Ordnung , das erklärt, warum die Zeiger nicht übereinstimmen. Meine eigentliche Frage ist also: Wie bekomme ich die richtige Version einer Methode aufgerufen werden? Insbesondere schreibt WebCallback vor, dass eine Funktion auf WebCommand() implementiert werden soll, und Callbacks [0] -> onWebCommand() bewirkt derzeit nicht, dass der onWebCommand(), den ich in UnderlyingClass geschrieben habe, ausgeführt wird. – unsorted

+0

Fügen Sie Ihrer Frage die Definition von WebCallback AND UnderlyingClass. Ich wette, Ihre Definition der virutalen Methode ist nicht korrekt. –

+0

d'oh, Methode hatte die falsche Signatur (constness) und eine Assert (false) Ich legte in der Schnittstelle die Version der Methode wurde nicht getroffen, weil Behauptungen in meiner gdb-Sitzung nicht aktiviert waren. Danke für die Hilfe! – unsorted

Verwandte Themen