Хранение шаблонных указателей на объекты в векторе и доступ через указатель базового класса

Я пытаюсь создать двумерный динамический массив, где каждая строка будет соответствовать списку другого типа данных. Для этой цели я использую вектор указателей, где каждый указатель будет указывать на одномерный массив определенного типа. Чтобы создать универсальный массив, я создал шаблонный класс, который я получил из абстрактного класса, чтобы я мог использовать указатели абстрактного класса в моем массиве ( 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? Это то же самое.

Другие вопросы по тегам