繁体   English   中英

同一个向量数组中不同类型的对象?

[英]different types of objects in the same vector array?

我在一个简单的逻辑模拟器程序中使用一个数组,我想切换到使用向量来学习它,但是我使用的“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)????

你在那里中途:

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) ),但是您需要确保在销毁本地对象后不引用指针。

是的,这将起作用 - 只要你在运行中使用run()一个虚函数,并在你将它们放在向量中时使用a和o上的运算符(&)的地址。

但是要注意对象的生命周期问题。 如果a和/或o超出范围,则向量将包含指向无效对象的指针。

此外,基类“Gate”应该有一个虚拟析构函数,否则在清理向量及其内容时会出现问题。

您正在使用

vector(gate*) G;

改成

vector<gate*> G;

你应该这样做

G.push_back(new ANDgate());

或者如果你使用boost使用shared_ptrs作为向量做了很多复制和向量中的裸指针可能是致命的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM