【发布时间】:2011-01-30 20:45:17
【问题描述】:
我想创建一个只能有一个实例的类。如果我尝试创建该类的另一个实例,它将返回第一个实例。
【问题讨论】:
-
它是为了练习......来自一本书
我想创建一个只能有一个实例的类。如果我尝试创建该类的另一个实例,它将返回第一个实例。
【问题讨论】:
我认为您正在 C++ 中搜索 Singleton pattern。这里是 implementation,这里是 linux tutorial,用于 C++ 中的单例模式
【讨论】:
我认为你想要的更接近MonoState,而不是 Singleton。
MonoState 的工作原理是让所有对象通过静态成员变量共享相同的状态。虽然实例不同,但它们返回的数据是相同的。这是一个简单的实现:
class MonoStateSession {
private:
static int _SessionId;
public:
void SetSessionId(int newSessionId) {
//Put threading checks/locks here
_SessionId = newSessionId;
}
int GetSessionId() {
return _SessionId;
}
}
//Usage
MonoStateSession session1 = new MonoStateSession();
session1.SetSessionId(123);
MonoStateSession session2 = new MonoStateSession();
assert(session2.GetSessionId() == 123);
【讨论】:
不......但你可以接近那个。例如,您可以创建一个类,其中每个实例只是同一个真实对象的克隆...例如:
struct TheRealObject
{
std::string s;
TheRealObject() { ... }
void foo(int x) { ... }
double bar(char y) { ... }
static TheRealObject& getInstance()
{
static TheRealObject trb;
return trb;
}
};
struct MyObject
{
std::string& s;
MyObject() : s(TheRealObject::getInstance().s) {}
void foo(int x) { TheRealObject::getInstance().foo(x); }
double bar(char y) { return TheRealObject::getInstance().bar(y); }
};
请注意,每个MyObject 实例仍将是一个不同的对象(例如,具有自己的地址),但它们将充当TheRealObject 唯一存在的实例的蹦床,用于方法和数据成员访问。
你为什么要做这么奇怪的事情?可能您只是在寻找单身人士(如上面的TheRealObject)?
【讨论】: