Хранение шаблонных указателей на объекты в векторе и доступ через указатель базового класса
Я пытаюсь создать двумерный динамический массив, где каждая строка будет соответствовать списку другого типа данных. Для этой цели я использую вектор указателей, где каждый указатель будет указывать на одномерный массив определенного типа. Чтобы создать универсальный массив, я создал шаблонный класс, который я получил из абстрактного класса, чтобы я мог использовать указатели абстрактного класса в моем массиве ( 12009314). Ниже приведен код, в котором я пытаюсь это сделать, но проблема в том, что у меня нет указателя массива в абстрактном классе, я не могу получить доступ к элементам массива:
class abs_attribute{
public:
virtual void insertAttribute(abs_attribute* a){}
virtual void print(){}
};
template <class T>
class attribute:public abs_attribute{
public:
T *data;
int size;
attribute(int s=3){
size=s;
data=new T[size];
}
void print(){
for(int i=0;i<size;i++)
cout<<data[i]<<" ";
cout<<"\n";
}
};
class Graph{
private:
vector<abs_attribute*>Attribute;
public:
Graph(){}
void insertAttribute(abs_attribute* a){
Attribute.push_back(a);
}
void printAttributes(){
for(int i=0;i<Attribute.size();i++){
for(int j=0;j<N;j++){
cout<<Attribute[i]->data[j]<<" ";//Not able to access data as it is not a member of abs_attribute
}
cout<<endl;
}
}
};
int main(){
abs_attribute* age=new attribute<int>(N);
age=new attribute<int>(N);
for(int i=0;i<N;i++)
static_cast<attribute<int>*>(age)->data[i]=rand()%50;
age->print();
Graph g;
g.insertAttribute(age);
g.printAttributes();
}
Есть ли способ получить доступ к массиву данных внутри класса Graph, не зная заранее тип шаблона производного класса? Основная цель всего этого занятия - создать в моем классе несколько массивов разных типов данных. Поскольку я не могу динамически добавлять члены данных в класс, я прибегнул к вектору, в котором я буду продолжать нажимать на указатели массива, но этот метод усложнялся из-за необходимости универсальности элементов массива.
1 ответ
Вы не можете волшебным образом сделать это. Тип объекта должен быть передан / известен / использован как-то.
В вашем main()
, у вас есть эта строка:
static_cast<attribute<int>*>(age)->data[i]=rand()%50;
Посмотри, как ты должен был static_cast
для того, чтобы получить доступ к data
? Это то же самое.