2013-01-08 89 views
0

的集合我有一個父類A和2派生類A1和A2:C++父類對象

class A { 

} 

class A1 : public class A {} 

class A2 : public class A {} 

而在另一個類B I希望保留的集合,它是由對象A1或A2的。

class B { 
    vector<A1> _A1s; 
    vector<A2> _A2s; 

} 

而不是保持2個獨立的載體A1S和A2S,有沒有辦法將這些2個向量進行組合?我想過矢量或向量,但是當A1s或A2s調整大小時(我認爲),任何一種方式都可能丟失對象。

有什麼想法?

+0

您可能想重新考慮在容器中存儲指向A的指針的優點/缺點,而不是維護兩個單獨的矢量 – Chubsdad

+0

我認爲您應該更多地瞭解您在C++中的繼承關係;這個話題似乎對你來說是比較新的,有可能你甚至不希望任何繼承(初學者傾向於在C++中過度使用繼承)。 –

回答

3

您可以使用智能指針的載體,基地型

std::vector<std::shared_ptr<A>> a_ptr; 

注: 你需要虛析構函數添加到

class A { 
public: 
    virtual ~A() {} 
}; 

用法:

struct B { 
public: 
    B() { 
    a_ptr.push_back(std::shared_ptr<A>(new A1)); 
    a_ptr.push_back(std::shared_ptr<A>(new A2)); 
    } 

private: 
    std::vector<std::shared_ptr<A>> a_ptr; 
}; 

int main(int argc, char* argv[]) 
{ 
    B b; 
    return 0; 
} 

而且課後定義你錯過;,你有額外的科目A前面yword類下面的語句:

class A1 : public class A {}; 

應該是:

class A1 : public A {}; 
+0

很好的答案。但是讓我添加一些東西:將A1/A2和其他實例添加到向量中後,您將不知道哪些元素指向基礎或哪些派生類。有一個簡單的方法可以找到:向基類及其派生類添加一個像「std :: string getType()」這樣的虛擬方法。每個類都返回其標識符字符串。因此,在解釋向量時,可以使用此方法來識別A指針後面的內容,並執行static_cast來獲取整個實例。 – Gombat

+0

沒錯。如果引用計數增加,則該對象不會被刪除。我認爲shared_ptr是我所追求的。謝謝 – eltonsky

+0

順便說一句,我試圖在向量>中搜索。有沒有簡單的方法來做到這一點?我知道我可以實現一個運算符==矢量。那個人呢? – eltonsky

0

您可以使用指針的向量

class B { 
public: 
    std::vector<A*> _AXs; 
}; 

將同時接受A1和A2指針類型。

請注意,在這種情況下,您應該設置虛擬的A類的析構函數。 如果你不這樣做,當你試圖刪除一個A*對象時,程序無法猜測什麼是真正的類型。

class A { 
public: 
    virtual ~A() {}  
}; 
0

可以使用什麼別人說,再加上設計模式稱爲visitor如果你想仍然能夠使用底層A指針作爲A1A2。訪問者模式並不是真正爲此設計的,但使用它的方式很不錯。