C ++如何从虚拟类的模板化子类中获取数据?

时间:2018-08-30 19:07:57

标签: c++ class inheritance containers virtual

所以我有这个类,我需要以某种方式获取存储在_data变量中的数据。

template<typename T>
class gNode : public BaseSuperclass {
private:
    int _id;
    T _data;
public:

    gNode(int id, T data) {
        _id = id;
        _data = data;
    }

    const int getId() { return _id; }

    T getData(){
        return _data;
    }
};

该类继承自该虚拟类,因为我需要将gNode类存储在容器中,并且由于该容器而无法正常工作。

class BaseSuperclass {
// ...
public:
    virtual const int getId() = 0;
};

此容器将是我访问gNode对象的唯一方法。但是现在关于如何获取_data变量中的数据,我无所适从,因为虚拟类不能具有返回类型未知的函数。

那是容器:

vector<BaseSuperclass *> nodes;

下面的代码给我一个细分错误。

gNode<T>* node1 = dynamic_cast<gNode<T>*>(nodes[0]);
node1->getData();

我感谢我能获得的所有帮助。 谢谢。

编辑:我发现,如果gNode._data具有不同类型,则会发生这种分段错误。因此,如果我只传递int或仅传递字符串,那么一切都很好。但是,如果第一个gNode是一个字符串,第二个gint是一个int,它将出错。对我来说还是没有道理

edit2: 请求的可编译(我认为)示例:     #包括     #include

using namespace std;
class BaseSuperclass {
public:
    virtual const int getId() = 0;
};

template<typename T>
class gNode : public BaseSuperclass {
private:
    int _id;
    T _data;
public:

    //Konstruktor
    gNode(int id, T data) {
        _id = id;
        _data = data;
    }

    const int getId() { return _id; }

    T getData(){
        return _data;
    }
};

class Graph {
public:
    vector<BaseSuperclass *> nodes;

    template<typename T>
    void addNode(int nodeId, T data) {      


        nodes.push_back(new gNode<T>(nodeId, data));
        gNode<T>* node1 = dynamic_cast<gNode<T>*>(nodes[0]);
        T test = node1->getData();
        cout<<test<<endl;
};
void Main(){
Graph graph1;
graph1.addNode(1, "vvv");
graph1.addNode(2, 12);
return 0;
}

1 个答案:

答案 0 :(得分:2)

addNode中,您push_back的类型为T,然后尝试也访问类型为T的第一个元素。

您两次致电addNode,使用两种不同的类型。

因此,第二次调用addNode时,T与第一个元素中存储的类型不同。因此dynamic_cast<gNode<T>*>(nodes[0]);将返回nullptr

您需要确保在读取时使用与存储时相同的类型。