所以我有这个类,我需要以某种方式获取存储在_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

您需要确保在读取时使用与存储时相同的类型。

10-04 13:59