【发布时间】:2017-10-20 20:46:09
【问题描述】:
我目前有以下循环双向链表作为父级(由我班的教授提供):
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 构造函数中弹出时,它会“忘记”它所做的一切。 cdll 构造函数中this 的地址与y 的地址匹配。我也试过Queue<datatype>::Queue() : Queue::CDLL<datatype>() {},但同样的行为仍然存在。
我看过了:
C++ Inheritance constructor override、What are the rules for calling the superclass constructor? 和其他一些标题与此类似的问题,但我似乎无法解释其行为。
我浏览了 google/SO,并尝试了许多人建议的解决方案,但无济于事。
【问题讨论】:
-
为什么以 Bjarne Stroustrup 的名义你会这样做:
Queue<int> * y = &Queue<int>(2, 1);?? ...这不是 C++ 中的合法声明。 -
&Queue<int>(2, 1)不应该编译。你用的是什么编译器? -
@WhiZTiM 稍后,我们将创建一个公开继承自
CDLL的Queue,并能够创建一个包含队列和cdlls 的CDLL指针数组 -
@Quentin 我目前正在使用 VS2017
标签: c++ c++11 templates inheritance constructor