0

这可能是一个业余问题,但在这里。我有三个课程:

可绘制对象:

class DrawableObject
{
private:

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

继承自 DrawableObject 的 FormElement:

class FormElement : public DrawableObject

FormElement 有一个名为 wasPushed 的方法:

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

return wasPushed;
}

最后,继承自 FormElement 的 TextField:

class TextField : public DrawableObject

我还有一个名为 Form 的类:

class Form {

public:

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

private:

    list<FormElement*> formElements;
}

Form 在其 generateForm() 方法中将一些 TextFields 添加到其列表中:

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.

好吧,当程序尝试从 wasPushed 方法访问 getX() 时,程序退出了。

谁能告诉我为什么?我定义错了什么?

我非常感谢你。马丁。

4

1 回答 1

1

您正在按值返回列表:

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)
于 2012-10-07T22:09:07.893 回答