[英]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
構造函數時,它“忘記”了它所做的一切。 this
在cdll
構造函數中的地址與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.