我目前有以下循环双重链接列表作为父级(由班级教授提供):
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++ Inheritance constructor override,What are the rules for calling the superclass constructor?和其他一些标题与此相似的问题,但我似乎无法解释其行为。
我浏览过google / SO,并尝试了许多建议的许多解决方案,但无济于事。
最佳答案
这个:
Queue<int> * y = &Queue<int>(2, 1);
无效的C ++。它显然已被MSVC扩展接受。问题是,尽管此扩展名允许您使用临时地址,但不会延长其寿命。这意味着
Queue<int>
的实例一旦完成y
的初始化便被销毁,从而使y
悬空并且无法通过调试器进行进一步检查。要禁用MSVC扩展,请use the
/Za
compiler switch。