2012-10-05 156 views
-2

可能重複:
Accessing Class Veriables in C++訪問類變量

您好我在C以下的類層次結構++

Class1 { 
    vector<Class2> vecClass2; 
} 

Class2 { 
    private: 
     const Class1 * ptrClass1; 
     vector<Class3> vecClass3; 
    public: 
     Class2(const Class1 * ptrClass1); 
     int intC2publicVar; 
     string strC2publicVar; 
} 

Class3 { 
    private: 
     const Class2 * ptrClass2; 
     vector<Class4> vecClass4; 
    public: 
     Class3(const Class2 * ptrClass2); 
} 

Class4 { 
    private: 
     const Class3 * ptrClass3; 
     vector<Class5> vecClass5; 
    public: 
     Class4(const Class3 * ptrClass3); 
     void class4Method() const; 
} 

在class4Method()我做這樣的事情這個:

void Class4::class4Method() const { 
    const Class2 * pC2 = ptrClass3->ptrClass2; 
    int valClass2 = pC2->intC2publicVar; 
    //Above value is giving wrong value, I have no idea from where it is fetching the wrong value 

    string strVatClass2 = pC2->strC2publicVar; 
    //Above line of code cause run time termination of code and programs stops as soon as this line executes. 

    const Class2 c2 = * pC2; 
    //Above line of code cause run time termination of code and programs stops as soon as this line executes. 

} 

我不知道爲什麼這class4Method)CLASS4的正在發生的事情(。請幫我解決這個問題。我的整個項目都因這個問題而受到打擊,如果不解決它,我就無法繼續前進。

+0

你初始化了數據成員指針嗎? – juanchopanza

+2

你的方法的第一行:'const Class2 * pC2 = ptrClass3-> ptrClass2;'你訪問'Class3'的私有成員。這不應該編譯。之後的任何事情都從運行時的角度來看。 – Fiktik

+0

同意,我不認爲你發佈了你正在「運行」的代碼:p另外,除非你在類之間使用繼承,否則你應該避免談論heirarchies(你有沒有機會忘記把繼承關係放在這個?)。 –

回答

2

做我認爲正確的const ClassN-1* ptrClassN-1成員是指向當前實例的「所有者」和實例它們指向生活在Class矢量N- 2

在這種情況下,你根本忘了向量有他們重新分配,以適應新插入值走動記憶其內容的這種習慣。不要在向量中存儲指向對象的指針,而是將對象存儲在列表中(並將指向實例的指針指向列表中的實例,因爲它仍然被複制)或存儲指針向量(並確保刪除析構函數中的元素)。

+0

+1,這是一個似是而非的建議。 – john

+0

@Jan是的,你的想法是正確的。但還有一件事。對象只存儲在向量中一次,向量不會隨後更新,只有指針被檢索。它可以導致這個問題嗎? –

+0

@Danish取決於你如何填充矢量。如果你只是在對象之後push_back對象...那麼肯定是的。 – Fiktik