это может быть любительский вопрос, но здесь это идет. У меня есть три предложения:
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.
Может кто-нибудь сказать, пожалуйста, почему? Что я не так определяю?
Я очень благодарю вас.
Мартин.
Вы возвращаете список по значению:
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)
Других решений пока нет …