2010-08-13 2 views
3

Я использую массив в простой программе логического симулятора, и я хочу переключиться на использование вектора, чтобы изучить его, но ссылка, которую я использую «OOP в 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), но они наследуют тип векторного массива (ворота) ????

+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

+0

Я не знаю, что такое shared_ptr :(и я не понимаю рисков этого. – Ahmed

+0

shared_ptr не являются рисками, они являются факторами, снижающими риск. Они заботятся об удалении, когда кодеры забывают называть delete при их новых распределениях – DumbCoder

ответ

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

1

Да, это сработает - до тех пор, пока вы выполняете виртуальную функцию в воротах и ​​используете адрес оператора (&) на a и o, когда вы помещаете их в вектор.

Будьте осторожны с вопросами об объекте жизни. Если a и/или o выходят за рамки, тогда ваш вектор будет содержать указатели на недопустимые объекты.

0

Вы используете

vector(gate*) G; 

изменение

vector<gate*> G; 

и вы должны сделать это

G.push_back(new ANDgate()); 

или если вы используете подталкивания использование shared_ptrs как вектор делает довольно много копирования и голые указатели в векторе могут быть фатальными.

1

Кроме того, базовый класс «Gate» должен иметь виртуальный деструктор, иначе будут проблемы при очистке вектора и его содержимого.

Смежные вопросы