2014-12-09 3 views
0

Привет, может кто-нибудь объяснить, что не так со следующим кодом? Я сначала включаю ребенка абстрактного класса в другой класс, который будет использовать этот ребенок.Полиморфный вектор

#include "child.h" 

Затем я заполняю вектор 2d ниже указателями, указывающими на экземпляры ребенка.

vector<vector<abstractitem*>*>vec; 

Я использую эту функцию класса в своем классе. Функция get находится в абстрактном классе.

void fn::getall() 
{ 
    for (int i=0;i<m_nrows;i++) 
    { 
     for(int j=0;j<m_ncolumns;j++) 
     { 

      vec[i][j]->get(); //error on this line: do you intend to use . instead? 

     } 
     printf("\n"); 
    } 

} 

Ваша помощь будет очень признательна.

+1

Вы, вероятно, имел в виду писать 'вектор <вектор > vec' вместо? – 5gon12eder

+4

'vec [i]' дает вам 'vector *'. 'vec [i] [j]' дает вам 'vector '. Если вы хотите использовать указатели повсюду, вам нужно понять, как они работают. – juanchopanza

+0

Спасибо, это решило мою проблему. Im новый с указателями. Не могли бы вы объяснить, почему вектор * дает вам vec [i] вместо того, что я искал? – fbdg

ответ

3

вам необходимо либо изменить

vector<vector<abstract*>*> vec; 

в

vector<vector<abstract*>> vec; 

или изменить

vec[i][j]->get(); 

в

(*vec[i])[j]->get(); 

первый, вероятно, лучше, нет веской причины, по которой внешний вектор должен содержать указатели на внутренний вектор.

еще лучше было бы с помощью смарт-указатели:

vector<vector<shared_ptr<abstract>>> vec; 

освобождает вас полностью от управления объектом памяти

1

Обратите внимание, что ваш внешний вектор является вектором указателей векторов, а не вектор векторы. Это означает, что вызов функции решает, как это:

vec[i][j]->get(); 
(vector<abstractitem*>*)[j]->get(); 
*(vector<abstractitem*>* + j)->get(); 
vector<abstractitem*> ->get(); 

Вы можете увидеть ошибку в последней строке: прибудете функция() пытается работать на вектор, но Вы писали, что ожидал, чтобы это было abstractitem* ,

Либо изменить декларацию вектор векторов, или добавить разыменования Вашему звонку:

vector<vector<abstractitem*>> vec; //option 1 
(*vec[i])[j]->get(); //option 2 
Смежные вопросы