2013-09-05 49 views
0

首先抱歉,如果我選擇了錯誤的標題,但不知道如何命名它。向量的對象指針和虛擬方法

代碼結構第一:

//== 1st file == 
class A { 
private: 
    int x; 
public: 
    int GetX() { return x; } 
}; 

//== 2nd file == 
class B { 
private: 
    A ob1; 
public: 
    virtual A & GetARef() { return ob1; } 
}; 

class C : public B { 
private: 
    A ob2; 
public: 
    A & GetARef() { return ob2; } 
}; 

class D : public B { 
public: 
    // something else w/e 
}; 


//== 3rd file == 
class E { 
private: 
    std::map <int,C> m; 
public: 
    C* GetCPtr(int idx) { return &m[idx]; } 
}; 

//== 4th file == 
void foo(E & E_Obj) { 
    std::vector <B*> v; 
    v.push_back(E_Obj.GetCPtr(0)); 
    v.push_back(/*some pointer to D class*/); 
    Boo(v); // FORGOT TO ADD IT ! Sorry 
}; 

//== 5th file == 
void Boo(std::vector <B*> & v) { 
    std::cout << v[0]->GetARef().GetX(); // returns B::ob1 's x instead of C::ob2 's x. 
}; 

正如在評論中寫道,噓得到錯誤的 'X'。我只是想知道是否因爲指針超出了範圍,或者我錯誤地設計了錯誤的東西。如何解決這個問題,所以我可以得到正確的x(C :: ob2的一個)。

對不起,有點奇怪的類名等,但原始代碼更長,所以我試圖只顯示情況。

@edit 在Foo()中忘了添加它,它返回我期望的 - C :: ob2的x。

+1

你傳遞給'Boo'的是什麼? –

+0

如果您擔心超出範圍,您可以嘗試在C的析構函數中添加一些日誌記錄。 – Medinoc

+0

@Medinoc或使用智能ptrs。 – IdeaHat

回答

0

對不起,不留下評論的答覆,但我決定它的價值後整體。也很抱歉,如此晚的答覆。我花了一整天的時間在代碼中慢慢挖掘,因爲你已經證明我的代碼很好(除了例子代碼中的幾個拼寫錯誤,對此感到抱歉)。實際上,在重寫代碼字母之後,我終於找到了一個我通常不會去找的麻煩製造者。我的同事在整理一些東西的時候並沒有改變相關矢量中的指針,而是改變了它們的內容。

喜歡的東西的那

vector <E*> v; 
// ... 
*v[i] = ... 

代替

v[i] = ... 

固定的是,它確實可以作爲intented後。感謝您的幫助和清理。也很抱歉浪費你的時間。

+0

這是正確的答案,因爲它總結了這個問題。你應該接受它(是的,你可以接受你自己的答案)。 –

0

這是你在做什麼

#include <iostream> 

using namespace std; 

class Base{ 
     const int b = 0; 
     public: 
     virtual const int& getInt(){ 
       return b; 
     } 
}; 
class LeafOverriding : public Base{ 
     const int l = 1; 
     public: 
     virtual const int& getInt(){ 
       return l; 
     } 
}; 
class Leaf : public Base{ 
}; 

int main(){ 
     cout << Leaf().getInt() << '\t' << LeafOverriding().getInt() << endl; 
} 

的本質和它沒有任何問題(即它確實輸出0 1)。我會說,你的代碼片段 - 不會編譯,順便說一句 - 並不代表真正的代碼。

我這麼懶我逼你用C++ 11的支持編譯它,因爲const int b = 0const int l = 1 :)

相關問題