разные типы объектов в одном и том же векторном массиве? - PullRequest
3 голосов
/ 13 августа 2010

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

Ответы [ 4 ]

4 голосов
/ 13 августа 2010

Вы на полпути:

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 голос
/ 13 августа 2010

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

1 голос
/ 13 августа 2010

Да, это будет работать - пока вы делаете run () виртуальной функцией в gate и используете адрес оператора (&) для a и o, как вы положили их в вектор.

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

0 голосов
/ 13 августа 2010

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

vector(gate*) G;

изменить на

vector<gate*> G;

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

G.push_back(new ANDgate());

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...