📄 18.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 + -