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

C++ How do I get the data out of a templated child of a virtual class?

所以我有这个 class 并且我需要以某种方式获取存储在 _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;
    }
};

此 class 继承自此虚拟 class,因为我需要将 gNode class 存储在容器中,而由于容器的原因,它无法工作。

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

这个容器将是我访问 gNode 对象的唯一途径。但是现在我不知道如何检索 _data 变量中的数据,因为虚拟 class 不能具有未知 return 类型的函数。

那就是容器:

vector<BaseSuperclass *> nodes;

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

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

我很感激能得到的每一个帮助。 谢谢。

编辑: 我发现如果 gNode._data 有不同的类型,就会发生这个分段错误。所以如果我只传递 int 或字符串,一切都很好。但是如果第一个 gNode 是字符串而第二个是 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;
}

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

您调用 addNode 两次,有两种不同的类型。

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

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