2013-09-26 67 views
0

我有一個類真的很複雜,它有另一個類的向量。我報告一個更簡單,無論如何它有我已經能夠找到的問題。複製特定類時崩潰

// the inner class 
class DuffyDuck{ 
    int isblack; // 0 is white, 1 is black 
    int n_duck; 
    vector<DuffyDuck> * point_Duck; 
    public: 
    DuffyDuck(int isblack):isblack(isblack){ 
    } 
    void set_point(vector<DuffyDuck> & Abitants){ 
     point_Duck=&Abitants; 
    } 
}; 

// the complessive class 

class DuckCity{ 
    vector<DuffyDuck> DuckAbitants; 
    public: 
    DuckCity(int numwhite,int numblack){ 

     for(int i=0;i<(numblack+numwhite);++i){ 
      DuckAbitants.push_back(DuffyDuck(i>=numblack)); 
      DuckAbitants[i].set_point(DuckAbitants); 
     } 

    } 
}; 

現在這個工作(我用point_Duck幾個功能),但如果我做這樣的事情後顯示一次,它被稱爲例如「(* point_Duck)[2] .n_duck;」在一個函數中,項目崩潰。

這隻會發生,如果我這樣做:

DuckCity LittleTown(0,0); 
LittleTown=DuckCity(3,5); 

而且使用一些功能,這稱之爲指針之後。

如果我直接做LittleTown(3,5)都是對的。

我希望我解釋得不錯。

+0

只是一個一般的建議:在你的縮進工作!就目前來看,幾乎沒有任何縮進讓你的代碼真的難以閱讀。 – JustSid

+0

學校開學了嗎? – INS

+0

@JustSid現在好點了嗎?我真的不明白如何縮進! –

回答

5

DuffyDuck類正在存儲DuckCityvector<>成員的地址。因此,當您將DuckCity複製到其他實例時,該新實例將具有不同的vector<>實例。但是,該向量中的每個DuffyDuck實例的地址仍舊是舊的DuckCity實例的一部分。

所以,你拷貝到littleTown會產生晃來晃去的指針。

我建議您重新考慮您的設計DuffyDuck,或實施DuckCity的賦值運算符,對vector<>的每個元素執行深度複製。如果您實施賦值運算符,請記住也要遵循Rule of Three

+0

好吧,我會嘗試創建一個拷貝構造函數,因爲我想要容納這個指針,它簡化了很多東西。 –

+0

@TommasoFerrari:你實際上是在使用賦值運算符,所以這是你需要解決的緊急問題,但是請閱讀三條規則。 – jxh

+0

Immidiatly我解決了創建一個公共函數,該函數在輔助時刻爲DuckAbitants的每個元素執行'set_point',而不是在構造函數中執行'set_point'。你對此有何看法? –

0

問題的原因是,每個DuffyDuck都有一個指向DuffyDuck(s)向量的指針。當類被銷燬時,引用變爲無效 - >崩潰。

DuckCity littleTown(1,2); // this creates a duck city 
          // with each duck pointing to the DuckAbitans vector. 
littleTown=DuckCity(3,5); // this initializes another instance (call it INST) 
          // of DuckCity and 
          // then it assigns (via = operator) the value to littleTown 
          // by **copying** the DuffyDuck structures into a newly 
          // allocated vector. This makes the pointer of each DuffyDuck 
          // invalid after INST is destroyed (as it is a temporary object) 
0

當你複製的Abitants地址,你正在服用的向量地址由DuckCity(3,5)創建的臨時對象。這個臨時對象然後被複制到littleTown中,並且原始對象被銷燬。這意味着您的原始指針Abitats指向未使用的內存,從而導致崩潰。

很難說你應該如何解決這個問題 - 可能是通過一個「重構」指針的複製構造函數。