【问题标题】:C++ Class Template Constructor inheritance with pointers带有指针的 C++ 类模板构造函数继承
【发布时间】: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&lt;datatype&gt;::Queue() : Queue::CDLL&lt;datatype&gt;() {},但同样的行为仍然存在。

我看过了:

C++ Inheritance constructor overrideWhat are the rules for calling the superclass constructor? 和其他一些标题与此类似的问题,但我似乎无法解释其行为。

我浏览了 google/SO,并尝试了许多人建议的解决方案,但无济于事。

【问题讨论】:

  • 为什么以 Bjarne Stroustrup 的名义你会这样做:Queue&lt;int&gt; * y = &amp;Queue&lt;int&gt;(2, 1);?? ...这不是 C++ 中的合法声明。
  • &amp;Queue&lt;int&gt;(2, 1) 不应该编译。你用的是什么编译器?
  • @WhiZTiM 稍后,我们将创建一个公开继承自CDLLQueue,并能够创建一个包含队列和cdlls 的CDLL 指针数组
  • @Quentin 我目前正在使用 VS2017

标签: c++ c++11 templates inheritance constructor


【解决方案1】:

这个:

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

不是有效的 C++。它显然被 MSVC 扩展所接受。问题是,虽然此扩展允许您获取临时地址,但它不会延长其生命周期;这意味着Queue&lt;int&gt; 的这个实例在y 的初始化完成后立即被破坏,留下y 悬空并且通过调试器进一步检查是无意义的。

要禁用 MSVC 扩展,use the /Za compiler switch

【讨论】:

  • 如果我要创建一个包含**cdll 的数组,我想在其中放置队列和cdlls,该怎么办?
  • @npengra317 CDLL&lt;int&gt; *p = &amp;x; 工作正常,通过隐式指针转换。在处理多态对象的集合(例如拥有Queues 和CDLLs 的数组)之前,您可能还需要了解动态内存分配和智能指针。
  • 明白了,我会把这个引用给我的教授。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-12-14
  • 2013-09-04
  • 1970-01-01
  • 2016-12-30
  • 2013-05-21
  • 2016-03-04
  • 2013-01-02
相关资源
最近更新 更多