我有三個以下列方式組織的類。 Foo
也是衍生自Foo
的模板類別Bar
和衍生自Foo
的Doo
。它們都實現了doX()
成員函數,該函數在Foo
中定義爲虛函數。繼承:包含派生類實例的基類的模板容器
我需要有一個向量(或任何其他容器)的Bar
和Doo
對象。例如,名爲vec
的兩個對象的向量,第一個元素應該是Doo
,第二個元素應該是Bar
。當我打電話給vec[0].doX()
Doo::doX()
。定義指向Foo
對象的指針矢量,完成這項工作。但我不確定實例在哪裏存儲。如果我把對象的指針,分配的內存可以讓對象被創建的範圍後發佈
我準備了一個最小的工作示例爲了說明問題:
#include <iostream>
#include <vector>
using namespace std;
template <typename T>
class Foo
{
public:
virtual void doX(){cout<<"doX from Foo"<<endl;}
};
template <typename T>
class Bar : public Foo<T>
{
public:
void doX(){cout<<"doX from Bar"<<endl;}
void g(string const &input); // some test function may be used in doX
int x; // some test data may be used in doX
};
template <typename T>
class Doo : public Foo<T>
{
public:
void doX(){cout<<"doX from Doo"<<endl;}
};
void doSomething(vector<Foo<int>* >& target)
{
Foo<int> X;
// do some extreme job to generate X
target.push_back(&X); // ==> This is problematic
}
int main()
{
Foo<int> f;
Bar<int> b;
Doo<int> d;
vector<Foo<int> > v;
v.push_back(f);
v.push_back(b);
v.push_back(d);
v[0].doX(); // doX from Foo
v[1].doX(); // doX from Foo
v[2].doX(); // doX from Foo
vector<Foo<int>*> v2;
v2.push_back(&f); // here is no problem, but if `f` is generated inside
// a function that receives a reference to `vec` there
// will be problems
doSomething(v2); // This is problematic
v2.push_back(&b);
v2.push_back(&d);
v2[0]->doX(); // doX from Foo
v2[1]->doX(); // doX from Foo but dangerous! May crash
v2[2]->doX(); // doX from Bar
v2[3]->doX(); // doX from Doo
return 0;
}
我之前沒有聽說過智能指針。上面的代碼現在解決了我的問題。我要去谷歌''標題。謝謝 –
2012-07-14 09:04:03
@ sorush -r您可能需要C++ 11來處理'',但boost和TR1也提供了一些智能指針。 –
juanchopanza
2012-07-14 09:06:33