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

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

本文关键字:子类 获取 数据 虚拟 C++      更新时间:2023-10-16

所以我有这个类,我需要以某种方式获取存储在_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是一个字符串,第二个是一个整数,它就会出错。对我来说仍然没有意义

edit2:请求的可编译(我认为(示例: #include #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中,您使用类型T进行push_back,然后尝试访问类型为T的第一个元素。

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

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

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