Итак, у меня есть этот класс, и мне нужно как-то получить данные, хранящиеся в переменной _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();
Я ценю любую помощь, которую могу получить.
Спасибо.
edit: Я обнаружил, что эта ошибка сегментации происходит, если 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;
}