C++ Primer 练习13.2.2

13.27

class HasPtr {
public:
	HasPtr(const string& s = string()) :
		ps(new string(s)), i(0), use(new size_t(1)) {}
	HasPtr(const HasPtr& p) :
		ps(p.ps), i(p.i), use(p.use) {
		++* use;
	}

	HasPtr& operator=(const HasPtr& rhs) {
		++* use;
		if (-- * use == 0) {
			delete ps;
			delete use;
		}
		ps = rhs.ps;
		i = rhs.i;
		use = rhs.use;
		return *this;
	}

	~HasPtr() {
		if (-- * use == 0) {
			delete ps;
			delete use;
		}
	}
private:
	string* ps;
	int i;
	size_t* use;	//引用计数
};

13.28

#include<iostream>
#include<vector>
#include<string>

using namespace std;

class TreeNode {
public:
	TreeNode() :
		value(), count(0), left(nullptr), right(nullptr) {}
	TreeNode(const string& s, int c, TreeNode& l, TreeNode& r) :
		value(s), count(c), left(new TreeNode(l)), right(new TreeNode(r)) {}
	TreeNode(const TreeNode& t) :
		value(t.value), count(t.count) {
		if (t.left != nullptr)
			left = new TreeNode(*t.left);
		else
			left = nullptr;
		if (t.right != nullptr)
			right = new TreeNode(*t.right);
		else
			right = nullptr;
	}

	TreeNode& operator=(const TreeNode& t) {
		value = t.value;
		count = t.count;
		if (t.left != nullptr)
			left = new TreeNode(*t.left);
		else
			left = nullptr;
		if (t.right != nullptr)
			right = new TreeNode(*t.right);
		else
			right = nullptr;
		return *this;
	}

	~TreeNode() {
		if (left != nullptr)
			delete left;
		if (right != nullptr)
			delete right;
	}
private:
	string value;
	int count;
	TreeNode* left;
	TreeNode* right;
};

class BinStrTree {
public:
	BinStrTree() :
		root(new TreeNode()) {}
	BinStrTree(const TreeNode& t) :
		root(new TreeNode(t)) {}
	BinStrTree(const BinStrTree& bt) :
		root(new TreeNode(*bt.root)) {}

	BinStrTree& operator=(const BinStrTree& bt) {
		auto newt = new BinStrTree(bt);
		delete root;
		root = newt->root;
		return *this;
	}

	~BinStrTree() { delete root; }
private:
	TreeNode* root;
};

int main()
{
	TreeNode n1, n2, n4, n5;
	TreeNode n6("hello", 3, n4, n5);
	n2 = n6;
	TreeNode n3(n6);
	BinStrTree b1;
	BinStrTree b2(n6);
	b1 = b2;
	BinStrTree b3(b1);
	system("pause");
	return 0;
}

部分思路参考:C++primer 13.2.2节练习

猜你喜欢

转载自blog.csdn.net/Dzx1025/article/details/107368314