【发布时间】:2011-05-02 08:32:22
【问题描述】:
如果之前有人问过这个问题,我很抱歉(我试图找到它但徒劳无功)。 我在http://sourcemaking.com/design_patterns/singleton/cpp/1 经历了单例设计模式(代码从那里复制)
class GlobalClass
{
int m_value;
static GlobalClass *s_instance;
GlobalClass(int v = 0)
{
m_value = v;
}
public:
int get_value()
{
return m_value;
}
void set_value(int v)
{
m_value = v;
}
static GlobalClass *instance()
{
if (!s_instance)
s_instance = new GlobalClass;
return s_instance;
}
};
// Allocating and initializing GlobalClass's
// static data member. The pointer is being
// allocated - not the object inself.
GlobalClass *GlobalClass::s_instance = 0;
void foo(void)
{
GlobalClass::instance()->set_value(1);
cout << "foo: global_ptr is " << GlobalClass::instance()->get_value() << '\n';
}
void bar(void)
{
GlobalClass::instance()->set_value(2);
cout << "bar: global_ptr is " << GlobalClass::instance()->get_value() << '\n';
}
int main()
{
cout << "main: global_ptr is " << GlobalClass::instance()->get_value() << '\n';
foo();
bar();
}
我的问题是 如果(!s_instance) s_instance = new GlobalClass;
s_instance = new GlobalClass 将调用构造函数,但构造函数是非静态的,我们从静态函数调用它。这是如何运作的?构造函数在这方面“特殊”吗?
谢谢!
【问题讨论】:
-
唯一不能做的就是从同一个类的静态方法内部调用一个类方法。这很明显,因为方法需要一个可以调用的对象,而静态方法则不需要。
-
请注意,如今单身人士非常不受欢迎。观看this video 了解原因。总结:单例是全局变量,全局变量引入隐式依赖,隐式依赖是测试、调试和维护的噩梦。
-
请记住,每个程序都从 main 函数开始,而 main 是一个静态函数。所以是的,你可以。
-
如果你打算使用单例(你可能不应该这样做)那么请不要那样实现它。指针是可怕的,如果你不需要,就不应该使用(而且你不在这里(如果事实指针使单点更难正确执行)。问自己这个问题单点将如何/何时被销毁?
标签: c++ static constructor