2012-10-07 235 views
0

這可能是一個業餘問題,但在這裏。我有三個clases:繼承問題

DrawableObject:

class DrawableObject 
{ 
private: 

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

FormElement從DrawableObject inheirts:

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的Inheirts:

class TextField : public DrawableObject 

我也有一個類,命名形式:

class Form { 

public: 

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

private: 

    list<FormElement*> formElements; 
} 

表增加了一些TextField添加到它的列表,在其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. 

那麼,程序退出,當它試圖從wasPushed我訪問getX()的ThOD。

請問誰能告訴我爲什麼?我定義錯了什麼?

我非常感謝你。 Martín。 Martín。

回答

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) 
+0

我太愛你了,先生!就是這樣!非常感謝你! –

+1

@iL_Marto - 不要只愛沃恩。接受答案! –

+0

現在我感受到了愛! :) –