构造函数继承C ++,它提供了什么?

时间:2018-07-26 15:14:28

标签: c++ constructor unique-ptr

我有一棵树的这段代码。节点包含实际数据。 BST通过继承unique_ptr<BSTnode<Key,Data>>来封装它们。 BST不会向该类添加任何新字段。

如果我注释掉了构造函数继承using unique_ptr<BSTnode<Key,Data>>::unique_ptr,我的代码将继续工作,那么它到底能做什么?

template <class Key, class Data>
class BST : public unique_ptr<BSTnode<Key, Data>>
{
using unique_ptr<BSTnode<Key, Data>>::unique_ptr;
BST<Key, Data>() = default;
~BST<Key, Data>() = default;
BST<Key, Data>(const BST<Key, Data> &other) = delete;
BST<Key, Data>(BST<Key, Data> &&other) = default;
BST<Key, Data> &operator=(const BST<Key, Data> &other) = delete;
BST<Key, Data> &operator=(BST<Key, Data> &&other) = default;

BST<Key, Data>(unique_ptr<BSTnode<Key, Data>> &&nodeptr) : 
unique_ptr<BSTnode<Key, Data>>(move(nodeptr)){};

BST<Key, Data> &operator=(unique_ptr<BSTnode<Key, Data>> &&nodeptr)
{       
    this->unique_ptr<BSTnode<Key, Data>>::operator=(move(nodeptr));
    return *this;
};
}

测试程序:

int main(int argc, char** argv){
    BST<int,int> t; // default constructor
    t.add(1,1);
    BST<int,int> t2 = move(t); // move constructor
    // BST<int,int> t3 = t2; // copy constructor is deleted
    BST<int,int> t4; // default constructor
    t4 = move(t2); // move operator
    // t4 = t3; // copy operator=deleted !

    BST<int,int> nodeptr = std::make_unique<BSTnode<int,int>>(); // + 
    // + node move constructor
    t4 = move(nodeptr); // node move operator=
    return 0;
}

2 个答案:

答案 0 :(得分:2)

构造函数继承的要点是,您要使用源代码行而不是每个构造函数一行来说“所有构造函数都与超类一样”。

因此,如果您想使用此功能,则应删除所有构造函数定义:

BST<Key, Data>() = default;
~BST<Key, Data>() = default;
BST<Key, Data>(const BST<Key, Data> &other) = delete;
BST<Key, Data>(BST<Key, Data> &&other) = default;
BST<Key, Data> &operator=(const BST<Key, Data> &other) = delete;
BST<Key, Data> &operator=(BST<Key, Data> &&other) = default;
BST<Key, Data>(unique_ptr<BSTnode<Key, Data>> &&nodeptr) : 
unique_ptr<BSTnode<Key, Data>>(move(nodeptr)){};
通过一行代码

替换

using unique_ptr<BSTnode<Key, Data>>::unique_ptr;

(注意:如果在继承的基础上定义其他构造函数,则需要显式定义默认构造函数)

答案 1 :(得分:1)

您尚未了解构造 holder.Title.setText(current.getTitle()); holder.Description.setText(start+"...."+"read more"); holder.Date.setText(current.getPubDate());

的方法
std::unique_ptr<BSTnode<Key, Data>>

但是如果您详尽地添加BST<int,int> t5{ new BSTnode<int,int> }; // from raw pointer BST<int,int> t6{ nullptr }; // from nullptr 会添加的所有内容,那么它将变得多余