簡體   English   中英

具有指針的C ++類模板構造函數繼承

[英]C++ Class Template Constructor inheritance with pointers

我目前有以下循環雙鏈表作為家長(由班級教授提供):

template <class datatype>
class CDLL
{
public:
    struct node;
    class iterator;

    // Constructors
    CDLL(void);
    CDLL(unsigned int n_elements, datatype datum);
    CDLL(const CDLL& rlist);
    CDLL(iterator begin, iterator end);

    // .. code ...

};

我們的指令是創建一個從此CDLL繼承的隊列:

template <class datatype>
class Queue : protected CDLL<datatype> {
public:
    using CDLL<datatype>::CDLL;

    // ... code ...
};

在我的測試中,我有:

Queue<int> x = Queue<int>(2, 1); // Creates a queue of: [1, 1]
Queue<int> * y = &Queue<int>(2, 1); // Creates a queue of: []

我已經對其進行了徹底的調試,它遍歷了構造函數步驟(將每個元素推入隊列/ cdll),並且遍歷了每一步。 當它彈出cdll構造函數時,它“忘記”了它所做的一切。 thiscdll構造函數中的地址與y的地址匹配。 我還嘗試了Queue<datatype>::Queue() : Queue::CDLL<datatype>() {}但相同的行為仍然存在。

我看了看:

C ++繼承構造函數重寫調用超類構造函數的規則是什么? 以及其他一些標題與此類似的問題,但我似乎無法解釋其行為。

我瀏覽過google / SO,並嘗試了許多建議的許多解決方案,但無濟於事。

這個:

Queue<int> * y = &Queue<int>(2, 1);

無效的C ++。 它顯然已被MSVC擴展接受。 問題是,盡管此擴展名允許您使用臨時地址,但不會延長其壽命。 這意味着,一旦y的初始化完成,就會破壞Queue<int>該實例,從而使y懸空並通過調試器進行進一步檢查是毫無意義的。

要禁用MSVC擴展,請使用/Za編譯器開關

暫無
暫無

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

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