【问题标题】:different types of objects in the same vector array?同一个向量数组中的不同类型的对象?
【发布时间】:2011-03-29 08:24:21
【问题描述】:

我在一个简单的逻辑模拟器程序中使用了一个数组,我想切换到使用向量来学习它,但是我使用的参考资料“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,ORgate),但它们继承了向量数组的类型(门)????

【问题讨论】:

  • 请不要这样手动管理内存。至少非常从 Boost 或 TR1 或 C++0x 的 <memory> 中获得 shared_ptr 实现。对于你正在做的那种事情,你可能想看看Boost pointer containers
  • 我不知道什么是 shared_ptr :( 而且我不明白这样做的风险。
  • shared_ptr 不是风险,它们是风险缓解剂。当编码人员忘记在他们的新分配上调用 delete 时,他们会负责删除
  • 感谢 GMan 提供有用的链接

标签: c++ vector


【解决方案1】:

你已经成功了一半:

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

【讨论】:

  • 谢谢,我会研究 Boost。
【解决方案2】:

是的,这将起作用 - 只要您将 run() 设为门中的虚函数,并在 a 和 o 上使用 operator(&) 的地址,并将它们放入向量中。

不过要小心对象的生命周期问题。如果 a 和/或 o 超出范围,那么您的向量将包含指向无效对象的指针。

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      你正在使用

      vector(gate*) G;
      

      改成

      vector<gate*> G;
      

      你应该这样做

      G.push_back(new ANDgate());
      

      或者如果你使用 boost 使用 shared_ptrs 作为向量,它会进行大量的复制,并且向量中的裸指针可能是致命的。

      【讨论】:

        猜你喜欢
        • 2013-02-17
        • 2011-09-10
        • 2013-08-18
        • 1970-01-01
        • 2014-11-21
        • 1970-01-01
        • 2021-01-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多