1、只允许建立一个对象(单例模式):
a)方法一:非成员函数包含静态对象
//.h
class Printer {
public:
void submitJob(const PrintJob& job);
void reset();
void performSelfTest();
...
friend Printer& thePrinter();
private: // 构造函数私有
Printer();
Printer(const Printer& rhs);
...
};
//.cpp
Printer& thePrinter() //注意此函数不能为内联函数,以下解释
{
static Printer p; // 静态,单个打印机对象
return p;
}
//调用过程
thePrinter().reset();
thePrinter().submitJob(buffer);
缺点:使用了全局函数,可能名称冲突
b)方法二:静态成员函数包含静态对象
class Printer {
public:
static Printer& thePrinter();
...
private:
Printer();
Printer(const Printer& rhs);
...
};
//.cpp
Printer& Printer::thePrinter()
{
static Printer p;
return p;
}
//调用过程
Printer::thePrinter().reset();
Printer::thePrinter().submitJob(buffer);
缺点:使用繁琐,需要加类作用域修饰
c)方法三:命名空间内非成员函数包含静态对象
//.h
namespace PrintingStuff {
class Printer { // 在命名空间
public: // PrintingStuff 中的类
void submitJob(const PrintJob& job);
friend Printer& the Printer();
private:
Printer();
Printer(const Printer& rhs);
...
};
}
//.cpp
namespace PrintingStuff {
Printer& thePrinter() // 这个函数也在命名空间里
{
static Printer p;
return p;
}
}
//调用过程
Printing Stuff::thePrinter().reset();
Printing Stuff::thePrinter().submitJob(buffer);
或者
using Printing Stuff::the Printer;
thePrinter().reset();
thePrinter().submitJob(buffer);
设计过程:
1、Printer 类的构造函数是 private
,这样能阻止建立对象。
2、全局函数 the Printer
被声明为类的友元,让 the Printer 避免私有构造函数引起的限制。
3、the Printer 函数包含一个静态 Printer 对象
,这意味着只有一个对象被建立。
注:不要建立内联的包含局部静态数据的非成员函数,因为内联意味着“多个”(每一个函数调用处复制一次),而静态意味着“一个”(一个项目只有一个)。