将模板化对象指针存储在向量中并通过基类指针

时间:2018-03-10 20:30:50

标签: c++ c++11 vector class-template

我正在尝试创建一个2D动态数组,其中每一行都对应于不同数据类型的列表。为此,我使用指针向量,其中每个指针指向某种类型的1D数组。为了创建一个通用数组,我创建了一个模板类,它是从抽象类派生的,因此我可以在我的数组中使用抽象类指针(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 个答案:

答案 0 :(得分:0)

你无法神奇地做到这一点。必须以某种方式传递/已知/使用对象类型。

main()中,你有这一行:

static_cast<attribute<int>*>(age)->data[i]=rand()%50;

了解如何static_cast访问data?它是一回事。