簡體   English   中英

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是一個字符串,第二個gint是一個int,它將出錯。 對我來說還是沒有道理

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;
}

addNodepush_back的類型為T ,然后嘗試訪問第一個類型為T元素。

您使用兩種不同的類型兩次調用addNode

因此,第二次調用addNodeT與存儲在第一個元素中的類型不同。 因此, dynamic_cast<gNode<T>*>(nodes[0]); 將返回一個nullptr

您需要確保在讀取時使用與存儲時相同的類型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM