我有一棵树的这段代码。节点包含实际数据。 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;
}
答案 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
会添加的所有内容,那么它将变得多余