2015-05-18 15 views
0

我想知道是否可以將不同類型的非本地數據存儲到單個矢量中? 它是這樣的:單個C++矢量中的多種類型

class foo 
{ 
    private: 
     int x; 
    public: 
     foo(int a=0):x(a){} 
     int getx() { return x; } 
     void setx(int a=0) { x=a; } 
}; 
class var:public foo 
{ 
    private: 
     int y; 
    public: 
     var(int a=0, int b=0):foo(a), y(b){} 
     int gety() { return y; } 
     void sety(int a=0) { y=a; } 
}; 
class var1:public foo 
{ 
    private: 
     int z; 
    public: 
     var(int a=0, int b=0):foo(a), z(b){} 
     int getz() { return z; } 
     void setz(int a=0) { z=a; } 
}; 

如何聲明一個向量同時容納varvar1類型的數據? 我可以將它們存儲在一個std::vector<foo>,但然後他們會被視爲foo類型

+0

這幾天我們似乎很容易得到這個問題。有人告訴初學者,在一個容器中存儲不同類型是個好主意嗎? – Beta

+0

可能的[C++中的向量和多態性]重複(http://stackoverflow.com/questions/16126578/vectors-and-polymorphism-in-c) – Beta

回答

3

如果添加了分型foostd::vector<foo>,你將失去的分型信息。有關更多信息,請參閱What is object slicing?

A std::vector<foo>容器只能容納foo類型的對象。爲了能夠存儲衍生自foo的對象,您必須在堆上分配對象並將指針存儲在指針的vector(最好是vector)智能指針(std::vector<std::shared_ptr<foo>>std::vector<std::unique_ptr<foo>>)中。

+0

啊,顯然這意味着我犯了一個很大的錯誤,或者更確切地說,我校園裏的講師做到了。要麼他們忽視了這一點,要麼他們顯然不知道這一點。這應該是對班級關係的練習。男人,我開始擔心我編程的未來。 –

+0

只要你從這些錯誤中吸取教訓,我不會過多擔心。 –

1

您可以使用多態性。因此,不是聲明爲std::vector<foo>,而是聲明爲基類的指針:std::vector<foo*>

然後在你的功能,你可以聲明爲

vector<foo*> bar; 

bar.push_back(new var1());