⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 18.cpp

📁 C++编的如何为派生类提供写时拷贝语义的引用计数的小程序哦
💻 CPP
字号:
#ifndef _XiaoGeMVarTempleteHasBeenDefined_
#define _XiaoGeMVarTempleteHasBeenDefined_
#include <Afxmt.h>
template <class MVAR_TYPE>
//首先来定义一个Fred类:
class Fred {
 public:
	 
	 static Fred create1(const std::string& s, int i);
	 static Fred create2(float x, float y);
	 
	 Fred(const Fred& f);
	 Fred& operator= (const Fred& f);
	 ~Fred();
	 
	 void sampleInspectorMethod() const; 	// this 对象不会被改变
	 void sampleMutatorMethod(); 		// 会改变 this 对象
	 
	 // ...
	 
//然后我们再定义Fred类的友元类:Data类,Der1类和Der2类。其中,Der1类和Der2类继承Data类:
 private:
	 
	 class Data {
	 public:
		 Data() : count_(1) { }
		 Data(const Data& d) : count_(1) { } 			// 不要拷贝 'count_' 成员!
		 Data& operator= (const Data&) { return *this; } 	// 不要拷贝 'count_' 成员!
		 virtual ~Data() { assert(count_ == 0); } 		// 虚析构函数
		 virtual Data* clone() const = 0; 				// 虚构造函数
		 virtual void sampleInspectorMethod() const = 0; 	// 纯虚函数
		 virtual void sampleMutatorMethod() = 0;		// 纯虚函数
	 private:
		 unsigned count_; 						// count_ 不需要是 protected 的
		 friend Fred; 						// 允许Fred 访问 count_
	 };
	 
	 class Der1 : public Data {
	 public:
		 Der1(const std::string& s, int i);
		 virtual void sampleInspectorMethod() const;
		 virtual void sampleMutatorMethod();
		 virtual Data* clone() const;
		 // ...
	 };
	 
	 class Der2 : public Data {
	 public:
		 Der2(float x, float y);
		 virtual void sampleInspectorMethod() const;
		 virtual void sampleMutatorMethod();
		 virtual Data* clone() const;
		 // ...
	 };
	 
	 Fred(Data* data);
	 // 创建一个拥有 *data 的 Fred 智能引用
	 // 它是 private 的以迫使用户使用 createXXX() 方法
	 // 要求:data 必能为 NULL
	 
	 Data* data_; // Invariant: data_ is never NULL
};

Fred::Fred(Data* data) : data_(data) { assert(data != NULL); }

Fred Fred::create1(const std::string& s, int i) { return Fred(new Der1(s, i)); }
Fred Fred::create2(float x, float y) { return Fred(new Der2(x, y)); }

Fred::Data* Fred::Der1::clone() const { return new Der1(*this); }
Fred::Data* Fred::Der2::clone() const { return new Der2(*this); }
//下面是Fred的方法,包括了构造函数、析构函数和其它的方法: 
Fred::Fred(const Fred& f)
: data_(f.data_)
{
	++ data_->count_;
}

Fred& Fred::operator= (const Fred& f)
{
	// 不要更改这些语句的顺序!
	// (如此的顺序适当地处理了自赋值)
	++ f.data_->count_;
	if (--data_->count_ == 0) delete data_;
	data_ = f.data_;
	return *this;
}

Fred::~Fred()
{
	if (--data_->count_ == 0) delete data_;
}

void Fred::sampleInspectorMethod() const
{
	// 该方法承诺 ("const") 不改变*data_中的任何东西
	// 因此我们只要"直接把方法传递"给 *data_:
	data_->sampleInspectorMethod();
}

void Fred::sampleMutatorMethod()
{
	// 该方法可能需要更该 *data_中的数据
	// 因此首先检查this 是否唯一的指向*data_
	if (data_->count_ > 1) {
		Data* d = data_->clone(); // 虚构造函数用法
		-- data_->count_;
		data_ = d;
	}
	assert(data_->count_ == 1);
	
	// 现在"直接把方法传递给" *data_:
	data_->sampleInspectorMethod();

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -