Exercise 13.28: Given the following classes, implement a default constructor and the necessary copy-control members.
(a)class TreeNode {private:std::string value;int count;TreeNode *left;TreeNode *right;};(b)class BinStrTree {private:TreeNode *root;};
如下类别,请试着实作出它们的预设建构器(default constructor)和必要的拷贝控制成员。
TreeNode.h
#ifndef TREENODE_H#define TREENODE_H#include<string>class TreeNode{public: TreeNode() : count(0), left(nullptr), right(nullptr), user_cntr(new size_t(1)) {};//预设建构器(default constructor) TreeNode(const std::string& s) :value(s), count(s.size()), left(new TreeNode[s.size()]), right(left + s.size() - 1), user_cntr(new size_t(1)) {}//预设建构器 //拷贝建构器 TreeNode(const TreeNode& tn) : value(tn.value), count(tn.count), left(tn.left), right(tn.right),user_cntr(tn.user_cntr) { ++* user_cntr; } ~TreeNode() { if (-- * user_cntr == 0) { delete[]left; //left = nullptr; right = nullptr; delete user_cntr; } } TreeNode& operator=(const TreeNode& rhs) { ++* rhs.user_cntr; if (--*user_cntr==0) { delete[]left; //left = nullptr; right = nullptr; delete user_cntr; } value = rhs.value; count = rhs.count; left = rhs.left; right = rhs.right; user_cntr = rhs.user_cntr; return *this; }private: std::string value; int count; TreeNode* left;//由此想到动态阵列(动态配置多个物件);再由new[]想到要解构delete[] TreeNode* right; size_t* user_cntr;};#endif // !TREENODE_H
BinStrTree.h
#ifndef BINSTRTREE_H#define BINSTRTREE#include"TreeNode.h"class BinStrTree{public: //BinStrTree():root(nullptr){}//预设建构器 BinStrTree(const std::string& s=std::string()):root(new TreeNode(s)),user_cntr(new size_t(1)){} BinStrTree(TreeNode* tnp):root(tnp),user_cntr(new size_t(1)){} //拷贝建构器 BinStrTree(const BinStrTree& bst) :root(bst.root), user_cntr(bst.user_cntr){++* user_cntr;} //拷贝指定运算子 BinStrTree& operator=(const BinStrTree & bst ){ ++*bst.user_cntr; if (--*user_cntr==0) { delete root; delete user_cntr; } root = bst.root; user_cntr = bst.user_cntr; return *this; } //解构器 ~BinStrTree() { if (-- * user_cntr == 0) { delete root; delete user_cntr; } }private: TreeNode* root; size_t* user_cntr;};#endif // !BINSTRTREE_H
.cpp
#include<string>#include"TreeNode.h"#include"BinStrTree.h"using namespace std;int main() { TreeNode tn,tn1("孙守真"),tn2(string("阿弥陀佛")); tn = tn1; TreeNode tn3(tn2); tn = tn2; tn1 = tn3; BinStrTree bst("妙音如来"),bst1(bst),bst2,bstp(new TreeNode(tn3)); bst2 = bst; bstp = bst2;}
https://github.com/oscarsun72/prog1-C-Primer-5th-Edition-s-Exercises/tree/exercise13_28a/prog1
脸书直播实境秀
C++自修入门实境秀 542 重新译撰 《C++ Primer 5th》
13.2 拷贝控制与资源管理 13.2.2. Defining Classes That Act Like Pointers Defining a Reference-Counted Class~ 练习13.28
上一集:
https://www.facebook.com/100003034306665/videos/2659180040859780
下一集:
全部:http://bit.ly/2NoA2ID 原档下载:http://bit.ly/2Ixe2Vc
课文: http://bit.ly/2FIHV57
http://bit.ly/2mttmfa(第二篇)
第10-11章: http://bit.ly/2MuPmiZ
章12: http://bit.ly/2Rw53sH
重译12章:http://bit.ly/2V8UgZ7
http://bit.ly/2G2fPSg (docx)
重译11章:http://bit.ly/39P7HRU
第三篇:http://bit.ly/2UaFbDY
第三篇13章:http://bit.ly/33mh49y
https://play.google.com/books/reader?id=J1HMLyxqJfgC&pg=GBS.PT951.w.0.0.0.0.1
讲义下载:
http://bit.ly/2khF8Ic (全部)
程式码:
https://github.com/oscarsun72/prog1
缘起:http://bit.ly/2XwHOUH