2010-08-13 123 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

此外,基類「門」應該有一個虛擬析構函數,否則在清理向量及其內容時會出現問題。

相關問題