//: C10:Singleton.cpp
// Static member of same type, ensures that
// only one object of this type exists.
// Also referred to as the "singleton" pattern.
#include <iostream>
using namespace std;
class Egg
{
static Egg e;
int i;
Egg(int ii) : i(ii) {}
Egg(const Egg&); // Prevent copy-construction
public:
static Egg* instance() { return &e; }
int val() const { return i; }
};
Egg Egg::e(47);
int main()
{
//! Egg x(1); // Error -- can't create an Egg
// You can access the single instance:
cout << Egg::instance()->val() << endl;
} ///:~
若不声明拷贝函数为私有,那么就可以通过如下语句创建新的对象:
Egg e = *Egg::instance();
Egg e2(*Egg::instance());
发布评论
评论(6)
私有函数吧,boost很多都是这样的
构造函数声明为explicit可以防止编译器创建临时对象
将构造函数设置为私有。
不仅要将构造函数设为私有,还需要将拷贝构造函数声明为私有。如下代码所示:
若不声明拷贝函数为私有,那么就可以通过如下语句创建新的对象:
这两条语句都使用了拷贝构造函数,所以为了禁止这种可能,拷贝构造函数声明为私有的。
参考阅读:《C++编程思想第一卷第2版》10.3.3小节
可以这样实现:
1. 将构造函数定义为私有的;
2. 在类中定义一个static的成员函数CreateObject,调用这个私有的构造函数创建对象;
3. 这样的话,每当要创建这个类的对象时都要显示的调用这个CreateObject函数,无法隐式的调用构造函数生成临时对象。
这种机制有点类似于设计模式中的单例模式,但是可以不受限于单例。
// 拷贝构造函数,赋值运算符重载宏定义
#define COPY_CONSTRUCTOR_ASSIGNMENT(type)
type(const type&);
void operator=(const type)
class OperatorProcessor
{
public:
static OperatorProcessor* getInstance(); // 单一化实例,创建静态对象
~OperatorProcessor();
void OperatorAnd();
void OperatorOr();
void setOperator(STRING);
INT8 getOperatorChar();
private:
OperatorProcessor(); // 禁止使用构造函数
COPY_CONSTRUCTOR_ASSIGNMENT(OperatorProcessor); // 禁止使用拷贝和赋值函数
private:
STRING m_operator;
};
OperatorProcessor* OperatorProcessor::getInstance()
{
static OperatorProcessor obj;
return &obj;
}
int main()
{
// 使用时这样使用,维持一个静态对象
OperatorProcessor::getInstance()->getOperatorChar();
}