不同类型的对象在同一个向量数组中?
我在一个简单的逻辑模拟器程序中使用了一个数组,我想切换到使用一个向量来学习它,但是我使用的“Lafore的C++中的OOP”的引用没有很多关于向量和对象,所以我我有点失落。不同类型的对象在同一个向量数组中?
这里是以前的代码:
gate* G[1000];
G[0] = new ANDgate() ;
G[1] = new ORgate;
//gate is a class inherited by ANDgate and ORgate classes
class gate
{
.....
......
void Run()
{ //A virtual function
}
};
class ANDgate :public gate
{.....
.......
void Run()
{
//AND version of Run
}
};
class ORgate :public gate
{.....
.......
void Run()
{
//OR version of Run
}
};
//Running the simulator using overloading concept
for(...;...;..)
{
G[i]->Run() ; //will run perfectly the right Run for the right Gate type
}
现在我想做的是
vector(gate*) G;
ANDgate a
G.push_back(a); //Error
ORgate o
G.push_back(o); //Error
for(...;...;...)
{
G[i]->Run(); //Will this work if I corrected the error ??
}
所以一个矢量数组保存不同类型的对象(ANDgate, - 门),但他们继承矢量数组的类型(门)?
你有中途:
std::vector<gate*> G;
G.push_back(new ANDgate);
G.push_back(new ORgate);
for(unsigned i=0;i<G.size();++i)
{
G[i]->Run();
}
当然,这种方式,你需要照顾,以确保您的对象被删除。我会使用智能指针类型的矢量,例如boost::shared_ptr
来为您管理。您可以只存储本地对象的地址(例如G.push_back(&a)
),但是您需要确保在本地对象被销毁后不会引用这些指针。
谢谢,我会研究Boost。 – Ahmed 2010-08-13 09:38:30
是的,这将起作用 - 只要你运行()一个虚拟函数在门中,并使用运算符(&)上的a和o地址,就像你把它们放入向量中一样。
虽然要小心物体寿命问题。如果a和/或o超出范围,那么你的向量将包含指向无效对象的指针。
您正在使用
vector(gate*) G;
变化
vector<gate*> G;
,你应该这样做
G.push_back(new ANDgate());
,或者如果你使用boost使用shared_ptrs为载体做了不少抄袭而向量中的裸指针可能是致命的。
此外,基类“门”应该有一个虚拟析构函数,否则在清理向量及其内容时会出现问题。
请不要这样的手动内存管理。在*非常*最少获得一个'shared_ptr'实现,无论是从Boost或TR1,还是C++ 0x的''。对于那种你正在做的事情,你可能想看看[Boost指针容器](http://www.boost.org/doc/libs/1_43_0/libs/ptr_container/doc/ptr_container.html)。 –
GManNickG
2010-08-13 08:15:03
我不知道什么是shared_ptr :(我不明白其中的风险 – Ahmed 2010-08-13 08:26:02
shared_ptr不是风险,它们是风险缓解器,当编码器忘记调用删除它们的新分配时,它们负责删除 – DumbCoder 2010-08-13 08:30:06