Martin Flower在《重構(gòu)》里提到空對象模式,對于從容器中查找失敗需要返回引用時,可以使用,同時我覺的對于空指針調(diào)用也有一定作用,試舉一例:
1 #include <iostream>
2
3 class Mail{
4 public:
5 virtual void print()
6 {std::cout<<"Hello!"<<std::endl;};
7 void* operator new(size_t);
8 };
9
10 class NullMail{
11 NullMail(){};
12 static NullMail inst;
13 public:
14 virtual void print(){
15 using namespace std;
16 cout<<"error! You can't access a NULL object!"<<endl;
17 }
18 static NullMail& GetInst(){return inst;};
19 };
20
21 NullMail NullMail::inst;
22
23 void* Mail::operator new(size_t){
24 return &NullMail::GetInst();
25 }
26
27 Mail* GetMailPtr(){
28 return NULL;
29 }
30
31 Mail& GetMailRef(){
32 return (Mail&)NullMail::GetInst();
33 }
34
35 //

36
37 Mail* ptr_Mail = GetMailPtr();
38 Mail& ref_Mail = GetMailRef();
39 //ptr_Mail->print();
40 ref_Mail.print();
當(dāng)我們返回一個空指針給調(diào)用者,如果他沒有判斷,那就會發(fā)生系統(tǒng)崩潰,而我們返回一個空對象的引用就可以避免這一點(diǎn)。
另外一個附加的有趣現(xiàn)象,你認(rèn)為下面的調(diào)用會輸出什么信息?
1
2 ptr_Mail = new Mail;
3 ptr_Mail ->print();
4 ref_Mail.print();
正確的答案是:
1 Hello!
2 Hello!
因為Mail的缺省構(gòu)造函數(shù)將自己的vptr填給了NullMail單例。
=====================
一個問題,是不是Mail的每個公共接口,NullMail都要去實現(xiàn)一下? --th
//除非實在沒有必要,的確應(yīng)當(dāng)實現(xiàn)一下所有的公有虛方法。cuigang,2007-11-08
=====================
“對于從容器中查找失敗需要返回引用時”,下午剛剛碰到一個這樣的問題。 jb