C ++ Как получить данные из шаблонного дочернего элемента виртуального класса? - PullRequest
0 голосов
/ 30 августа 2018

Итак, у меня есть этот класс, и мне нужно как-то получить данные, хранящиеся в переменной _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;
}

1 Ответ

0 голосов
/ 30 августа 2018

В addNode вы push_back с типом T, а затем попробуйте получить доступ и к первому элементу с типом T.

Вы звоните addNode дважды, с двумя разными типами.

Таким образом, при втором вызове addNode, T отличается от типа, хранящегося в первом элементе. Таким образом, dynamic_cast<gNode<T>*>(nodes[0]); вернет nullptr.

Вы должны убедиться, что при чтении вы используете тот же тип, который вы использовали при сохранении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...