2010-08-13 110 views
3

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

+0

请不要这样的手动内存管理。在*非常*最少获得一个'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

+0

我不知道什么是shared_ptr :(我不明白其中的风险 – Ahmed 2010-08-13 08:26:02

+0

shared_ptr不是风险,它们是风险缓解器,当编码器忘记调用删除它们的新分配时,它们负责删除 – DumbCoder 2010-08-13 08:30:06

回答

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

+0

谢谢,我会研究Boost。 – Ahmed 2010-08-13 09:38:30

1

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

虽然要小心物体寿命问题。如果a和/或o超出范围,那么你的向量将包含指向无效对象的指针。

0

您正在使用

vector(gate*) G; 

变化

vector<gate*> G; 

,你应该这样做

G.push_back(new ANDgate()); 

,或者如果你使用boost使用shared_ptrs为载体做了不少抄袭而向量中的裸指针可能是致命的。

1

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

相关问题