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节练习