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
.
您需要确保读取时使用的类型与存储时使用的类型相同。
所以我有这个 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
.
您需要确保读取时使用的类型与存储时使用的类型相同。