C++ 如何从虚拟类的模板化子类中获取数据?
C++ How do I get the data out of a templated child of a virtual 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;
}
};
这个类是从这个虚拟类继承的,因为我需要将 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
。
您需要确保在读取时使用的类型与在存储时使用的类型相同。
相关文章:
- 继承期间显示未知行为的子类
- 通过指向指针数组的指针访问子类的属性
- 从父类方法返回子类对象
- c++, 在子类中,如何在没有对象的情况下访问父类的方法?
- 将父类对象强制转换为子类的问题
- C++ 继承:将子类传递给需要基类的函数并获取子类行为
- C++ 如何从虚拟类的模板化子类中获取数据?
- 在子类上调用模板化静态方法时获取类的类型名
- 获取参数的子类
- 类来获取 Base 的任何子类
- 使用子类从std :: Pironity_queue获取容器时会编译错误
- 基于className的字符串为QObject的子类获取QMetaObject
- 在Qt中获取超类中的子类的名称
- 使用shared_ptr时获取子类的type_info
- 如何从基类的唯一指针获取子类的成员
- 子类获取超类私有变量c++
- 获取定义为父类的子类以输出子函数
- 在窗口循环中,在窗口控件上获取鼠标移动比子类化更容易
- 获取 QWidget 的 Windows 消息而不对其进行子类化并重新实现 QWidget::winEvent
- 如何在c++中获取子类成员