2015-06-21 3 views
0

Я пытаюсь создать вектор, содержащий объекты из разных классов, полученные из базового класса. Следующие ответы на вопрос this question У меня есть следующий код, который пробует четыре разных способа (прокомментировал ниже); ни один из которых не будет скомпилирован:Вектор объектов из разных классов

class observable { 

    public: 
    virtual void observe(alglib::complex_1d_array)=0; 

    observable() { 

    } 
}; 

class Energy : public observable { 

    public: 
    void observe(alglib::complex_1d_array); 

    Energy() { 

    } 
}; 

class ObservableCollection { 

    private: 
    int no_obs; 
    vector<observable*> obs; 

    public: 

    ObservableCollection(vector<string> obs) { 
     no_obs=obs.size(); 
     for(int i=0;i<no_obs;i++) { 
      if(!strcmp(obs[i].c_str(), "energy")) { 
       // option 1: 
       // Energy E(); 
       // obs.push_back(E); 

       // option 2: 
       // obs.push_back<std::shared_ptr<observable>(new Energy())>; 

       // option 3: 
       // obs.push_back(new Energy()); 

       // option 4: 
       // observable *E=new Energy(); 
       // obs.push_back(E); 
      } 
     } 
    } 


}; 

Любые идеи?

+4

Каковы ошибки компиляции в каждом случае? –

ответ

3

Вариант 1 не может работать, потому что obs является vector<observable*> ^. Вы не можете нажать объект типа observable, потому что вы можете хранить в нем указатели (observable*). Вы можете хранить такие объекты в vector<observable>, но вы не можете хранить Energy объектов в таком векторе.

Вариант 2 не может работать, поскольку ecause obs является vector<observable*> ^. Вы не можете нажать объект типа std::shared_ptr<observable>, потому что вы можете хранить только raw указатели (observable*). Для хранения общих указателей вектор должен иметь тип vector<shared_ptr<observable>>.

Вариант 3 фактически такой же, как вариант 4. Они будут работать, если вы на самом деле пытались вставить переменную-член obj. Однако вы скрыли эту переменную, объявив локальную переменную с тем же именем (параметр функции). Вы не можете нажать observable* в вектор строк. Ошибка компиляции должна быть понятна. Если вы намерены вставить переменную-член, вы можете использовать this->obs вместо этого или даже лучше использовать другое имя для локальной переменной.

^Предполагая, что вы фактически нажимали на this->obs, а не на локальную переменную.

1

Вы передаете векторное обс (называемое тем же самым как член), и вы пытаетесь подтолкнуть свой класс к нему. Если вы хотите нажать на элемент, используйте this.obs.push_back().

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