?? 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 + -