所以我有这个类,我需要以某种方式获取存储在_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,它将出错。对我来说还是没有道理
编辑2:
请求的可编译(我认为)示例:
#包括
#包括
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]);
将返回nullptr
。
您需要确保在读取时使用与存储时相同的类型。