0

素人の質問かもしれませんが、以上です。私は3つのクラスを持っています:

ドローアブル オブジェクト:

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;
}

フォームは、その 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()

begin イテレータと end イテレータは、リストの 2 つの異なるコピーを指しています。また、これらの一時的なコピーは、反復する前に破棄されます。

formElements メンバーを直接使用することもできます。

for(list<FormElement*>::iterator it = formElements.begin()
    ; it != formElements.end()
    ; ++it)
于 2012-10-07T22:09:07.893 に答える