2.利用静态成员和静态函数设计实现一个单件类Singleton。所谓单件类,就是指在内存中最多仅有一个对象实例。提示:
a)不可以用构造函数创建对象,才能确保对象创建是可控的;(通过构造函数私有化来实现的)
b)当前是否有存在对象必须是随时可以知道的,并且如果存在,随时可以取得该对象的指针或者引用(通过静态成员变量来保存)
c)因为构造函数私有化,导致变量无法从外部创建,因而必须为用户提供一个获取对象的接口,当前对象如果存在,该接口直接返回对象引用,否则创建对象并返回对象引用。(通过静态成员函数来实现)
思考:同学们可以思考,如果想要实现对象池,把对象的数量控制在N以内,应该怎么修改?
http://www.360doc.com/content/20/0808/01/71093473_929112574.shtml
问题a) 为了实现构造函数的私有化,可以将构造函数声明为私有成员函数。这样,外部无法直接通过构造函数来创建对象。
以下是一个使用静态成员变量和静态函数实现单件类的示例代码:
class Singleton {
private:
static Singleton* instance; // 静态成员变量,用于保存对象的指针
Singleton() {} // 私有构造函数
public:
static Singleton* getInstance() { // 静态成员函数,用于获取对象的引用或指针
if (instance == nullptr) { // 如果对象不存在,创建对象
instance = new Singleton();
}
return instance; // 返回对象的引用或指针
}
};
Singleton* Singleton::instance = nullptr; // 静态成员变量需要在类外进行定义和初始化
问题b) 为了保存对象的状态,可以使用静态成员变量来存储对象的指针或引用。静态成员变量在整个类的实例中是共享的,因此可以保证只有一个对象实例。
问题c) 通过静态成员函数实现单件类的接口,静态成员函数内部调用私有构造函数来创建对象,并返回对象的引用或指针。
如果要限制对象数量,在一个对象池中最多只能存在N个对象,可以在静态成员函数中通过判断对象数量来决定是否创建新的对象。当对象池中的对象数量达到上限时,可以选择不创建新的对象,或者移除旧的对象来为新对象腾出空间。
以下是一个修改后的示例代码:
class Singleton {
private:
static Singleton* instance; // 静态成员变量,用于保存对象的指针
static const int MAX_OBJECTS = 10; // 对象池最大容量
static int numObjects; // 对象数量
Singleton() {} // 私有构造函数
public:
static Singleton* getInstance() { // 静态成员函数,用于获取对象的引用或指针
if (instance == nullptr && numObjects < MAX_OBJECTS) { // 如果对象不存在且未达到上限,创建对象
instance = new Singleton();
numObjects++;
}
return instance; // 返回对象的引用或指针
}
static void removeInstance() { // 静态成员函数,用于移除对象
if (instance != nullptr) { // 如果对象存在,移除对象
delete instance;
instance = nullptr;
numObjects--;
}
}
};
Singleton* Singleton::instance = nullptr; // 静态成员变量需要在类外进行定义和初始化
int Singleton::numObjects = 0; // 对象数量初始化为0
这样,通过 Singleton::getInstance() 获取对象时,最多只能存在 N 个对象。
如果要进一步限制并发访问,可以在 getInstance() 和 removeInstance() 函数内部添加互斥锁,以保证同一时间只有一个线程在创建或移除对象。使用C++11提供的std::mutex或std::lock_guard来实现互斥锁。