2009-08-06 3 views
3

У меня есть вектор указателей UnderlyingClass, хранящихся в другом объекте, и внутри метода в UnderlyingClass я хочу добавить «этот» указатель в конец этого вектора. Когда я смотрю на содержимое вектора сразу после вызова push_back, там находится неправильный указатель. Что может пойти не так?push_back (this) толкает неправильный указатель на вектор

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; 

Вот результат:

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

Кстати, обратные вызовы вектор указателей WebCallback и UnderlyingClass реализует WebCallback:

std::vector<WebCallback*> callbacks; 


class UnderlyingClass 
    :public WebCallback 

Скопировано из комментариев (см Ответ ниже)

мощность:

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 

В порядке, поэтому объясняется, почему указатели не совпадают.

Мой реальный вопрос, то это:

как получить правильную версию метода будет называться? В частности, WebCallback предусматривает, что функция onWebCommand() будет реализована, и прямо сейчас callbacks [0] -> onWebCommand() не вызывает onWebCommand(), который я написал в UnderlyingClass для выполнения.

+1

Это, безусловно, звучит как множественное наследование. –

+0

Имеет ли UnderlyingClass какие-либо другие базовые классы? –

+1

Dagnammit. Это второй раз, когда сегодня лампочка избила меня ровно на 47 секунд. Я как четверть света ближе к США, чем он, я должен победить! –

ответ

8

Это может произойти с множественным наследованием, если ваш макет выглядит следующим образом:

class UnderlyingBase { 
    char d[56]; 
}; 

class UnderlyingClass 
    :public UnderlyingBase, 
    public WebCallback { 

}; 

Затем макет может быть, как это, для каждого объекта, связанного с. Последний - это полный объект, содержащий первые два в качестве под-объектов базового класса, и что вы берете указатель и который будет преобразован в 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 

Теперь, так как ваш вектор содержит WebCallback*, компилятор настраивает указатель на точку в WebCallback подъобекта, в то время, когда он будет указывать на UnderlyingClass или UnderlyingBase, было бы начать 0x38 (56) байт ранее.

+0

А, это имеет смысл. Итак, этот вопрос возник из-за попытки отладки другой проблемы; является многократным наследованием при работе над более крупной проблемой? В частности, WebCallback имеет виртуальный метод onWebCommand(), который, конечно, реализован в UnderlyingClass, а в другой части кода я вызываю onWebCommand() для каждого из членов обратных вызовов. Прямо сейчас этот код для UnderlyingClass :: onWebCommand() не выполняется; что не так? – unsorted

+0

Это должно сработать. проверьте, действительно ли оба метода имеют одну и ту же подпись (включая константу). –

+0

действительно была проблема с подписью. Спасибо за помощь - отличное объяснение. – unsorted

3

Добавьте это в распечатке:

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

Держу пари, это то, что вы ищете.

+0

выход: это: 0x6359f70 размер 1 размер-1: 0x6359fa8 назад: 0x6359fa8 0: 0x6359fa8 это: 0x6359f70 WebCallback Эта: 0x6359fa8 текстовое окно PTR: 0x635a070 текстовое поле обратных вызовов PTR: 0x635a098 ладно , поэтому это объясняет, почему указатели не совпадают. Мой настоящий вопрос: Как мне получить правильную версию метода, который будет вызываться? В частности, WebCallback предусматривает, что функция onWebCommand() будет реализована, и прямо сейчас callbacks [0] -> onWebCommand() не вызывает onWebCommand(), который я написал в UnderlyingClass для выполнения. – unsorted

+0

Добавьте к вашему вопросу определение WebCallback И UnderlyingClass. Бьюсь об заклад, ваше определение вирутального метода неверно. –

+0

d'oh, метод имел неправильную подпись (constness) и утверждение (false), которое я вложил в версию этого метода, не получалось, потому что утверждения не были включены в моей сессии gdb. Спасибо за помощь! – unsorted

Смежные вопросы