Вопрос наследования

это может быть любительский вопрос, но здесь это идет. У меня есть три предложения:

DrawableObject:

class DrawableObject
{
private:

int x;
//...
public:
int getX();
//...
}

FormElement который наследуется от DrawableObject:

class FormElement : public DrawableObject

FormElement имеет метод с именем wasPush:

bool FormElement::wasPushed(SDL_Event event)
{
bool wasPushed =
(
( event.motion.x >= getX()) //Inherited getX()
&& // Blah blah...
) ? true : false;

return wasPushed;
}

Наконец, TextField, который наследуется от FormElement:

class TextField : public DrawableObject

У меня также есть класс с именем Form:

class Form {

public:

list<FormElement*> getFormElements();
void generateForm();

private:

list<FormElement*> formElements;
}

Форма добавляет некоторые TextFields в свой список в своем методе generateForm ():

void Form::generateForm() {

TextField *aTextField = new TextField(10, 10, 120);
this->formElements.push_back(aTextField);
}

Позже он пытается повторить это:

for(list<FormElement*>::iterator it = getFormElements().begin()
; it != getFormElements().end()
; ++it)
{
if ( (*it)->wasPushed(theEvent) )
{ //Etc.

Что ж, программа завершается, когда пытается получить доступ к getX () из метода wasPush.

Может кто-нибудь сказать, пожалуйста, почему? Что я не так определяю?

Я очень благодарю вас.
Мартин.

0

Решение

Вы возвращаете список по значению:

list<FormElement*> getFormElements();

это должно быть по ссылке:

list<FormElement*> &getFormElements();

Когда вы возвращаете значение, вы получаете временную копию списка.

Итак, в этом коде:

for(list<FormElement*>::iterator it = getFormElements().begin()
; it != getFormElements().end()

Итераторы начала и конца указывают на две разные копии списка. Кроме того, эти временные копии будут уничтожены до того, как у вас появится возможность их перебирать.

Вы также можете использовать член formElements напрямую:

for(list<FormElement*>::iterator it = formElements.begin()
; it != formElements.end()
; ++it)
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]