2012-10-04 63 views
0

我有一個Tab類,它有一個組件列表。C++推前迭代

list<Component*> Tab::getComponents() { 
    return (this->components); 
} 

void Tab::addComponent(Component* comp){ 
    this->components.push_front(comp); 
} 

Tab::Tab() { 
    // x = 25, y = 30 
Button* one = new Button(25,30,300,100, "images/button.png"); 
this->addComponent(one); 

Button* two = new Button(75,100,300,100, "images/button.png"); 
this->addComponent(two); 

    // x = 150, y = 150 
Button* three = new Button(150,150,300,100, "images/button.png"); 
this->addComponent(three); 
} 

現在有問題的代碼:

list<Component*>::iterator it = activeTab->getComponents().begin(); 
for (it ; it != activeTab->getComponents().end(); it++) { 
    offset.x = (*it)->getX(); 
    cout << "offset.x = " << offset.x << endl; 
    offset.y = (*it)->getY(); 
    cout << "offset.y = " << offset.y << endl; 
} 

這是for循環的第一次迭代的輸出:

offset.x = 25 
offset.y = 30 

不過,看到我用push_front(),它應該成爲:

offset.x = 150 
offset.y = 150 

我在做什麼錯?

編輯:for循環打印垃圾的第二次迭代...

offset.x = 16272 
offset.y = 17 

而第三隻打印segmentation fault :(

+1

您提供的代碼不會打印任何內容。你能發佈一個完整的例子,打印出offset.x和offset.y?我猜你的問題在於這段代碼,因爲你發佈的內容看起來很合理。 – Soverman

+0

我在for循環的第一行看到一個額外的''''。 – Recker

+0

@abhinole,這是一個錯字:P –

回答

5

Tab::getComponents()回報list<Component*>代替list<Component*>&,這意味着,this->components在返回時被複制。因此,讓我們來看看代碼:

list<Component*>::iterator it = activeTab->getComponents().begin(); 
// ``it'' is already INVALID here since the list returned in the above line 
// is already destructed! 
for (it ; it != activeTab->getComponents().end(); it++) { 
    offset.x = (*it)->getX(); //``it'' is invalid 
    cout << "offset.x = " << offset.x << endl; 
    offset.y = (*it)->getY(); 
    cout << "offset.y = " << offset.y << endl; 
} 

迭代器it是當你取消對它的引用無效。

6

注意,你的方法getComponents()返回一個副本,應返回引用。

list<Component*>& Tab::getComponents() { 
    return (this->components); 
} 
+0

哦,很好,這是錯誤。事實上,我很驚訝,循環終止。 – Soverman

+0

謝謝bazillion! =) –

+0

@Soverman它沒有,它segfaults。但這當然可以解釋段錯誤。 – CrazyCasta