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

3

我正在使用一个简单的逻辑模拟器程序中的数组,并希望转而使用向量进行学习,但我使用的参考书《C++面向对象编程》中关于向量和对象的内容不多,所以我有点迷茫。

以下是先前的代码:

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 ??
}    

向量数组可以容纳不同类型的对象(AND门、OR门),但它们会继承向量数组的类型(门)吗?


请不要像那样手动管理内存。至少从Boost或TR1,或C++0x的<memory>中获得一个shared_ptr实现。针对你正在做的那种事情,你可能需要查看Boost指针容器 - GManNickG
我不知道什么是shared_ptr :( 我也不理解其中的风险。 - Ahmed
shared_ptr 不是风险,它们是风险缓解器。当程序员忘记在他们的新分配上调用 delete 时,它们会处理删除。 - DumbCoder
感谢GMan提供的有用链接。 - Ahmed
4个回答

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

是的,那样做可以 - 只要你在gate中将run()设置为虚函数,并在将它们放入向量时使用a和o的地址运算符(&)。

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


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

0

您正在使用

vector(gate*) G;

变成

vector<gate*> G;

你应该这样做

G.push_back(new ANDgate());

如果你使用boost,那么用shared_ptrs来替代vector是一个好选择,因为vector会进行大量的拷贝操作,而在vector中使用裸指针可能会导致严重后果。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接