我在一个简单的逻辑模拟器程序中使用一个数组,我想切换到使用向量来学习它,但是我使用的“O ++ in C ++ by Lafore”中没有很多关于向量和对象的参考我很丢失。
以下是上一段代码:
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,ORgate),但它们继承了向量数组的类型(gate)????
答案 0 :(得分:4)
你在中途:
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)
),但是您需要确保在销毁本地对象后不引用指针。
答案 1 :(得分:1)
是的,这将有效 - 只要您在运行中使用run()一个虚拟函数,并在将它们放入向量时使用a和o上的运算符(&amp;)的地址。
但是要注意对象的生命周期问题。如果a和/或o超出范围,则向量将包含指向无效对象的指针。
答案 2 :(得分:1)
此外,基类“Gate”应该有一个虚拟析构函数,否则在清理向量及其内容时会出现问题。
答案 3 :(得分:0)
您正在使用
vector(gate*) G;
更改为
vector<gate*> G;
你应该这样做
G.push_back(new ANDgate());
或者如果你使用boost使用shared_ptrs作为向量做了很多复制和向量中的裸指针可能是致命的。