静态成员函数和常规成员函数都可以访问静态变量。但是,我看到静态成员函数通常被定义为getinstance()以获取静态变量Instance。为什么会这样?它背后有什么理由吗?我可以使用常规函数来获取静态变量实例。
答案 0 :(得分:1)
你的意思是“为什么它是静态成员而不是非成员”?所以它是(a)在类中的作用域,(b)可以访问私有构造函数和实例。
如果你真的想让所有参与者的生活变得更加困难,你可以让它成为非会员。您需要为其提供更详细的名称(例如get_instance_of_whatever
而不是whatever::get_instance
),并将其设为好友,以便它可以访问,并在必要时创建实例。将它作为静态成员会更直接。
(我假设你并不是说“为什么它是静态的而不是非静态的”。显然,你不能在没有对象的情况下调用非静态成员,并且如果不调用它就无法访问对象访问者功能。)
当然,你shouldn't首先要实施一个单身人士;尤其是在C ++中,除了反模式的一般概念问题之外,它还会导致生命周期问题的雷区。
答案 1 :(得分:0)
要获取对象实例,您需要调用该函数,并调用该函数,您需要一个对象实例。除非它是一个静态函数。
答案 2 :(得分:0)
除了保持对象的实例之外,单例中静态函数instance()
的点是在调用它时创建的。
假设构造函数和析构函数是公共的,您还可以创建全局变量或静态变量,但在输入main()
之前创建并初始化它。请注意,人们将其设为私有,以防止创建具有该对象的单个实例。
以下示例显示了我上面解释的内容:
#include <iostream>
struct A
{
static A& instance()
{
static A a;
return a;
}
void foo(){
std::cout << "A::foo()" << std::endl;
}
private:
A(){
std::cout << "creating A" << std::endl;
}
~A(){
std::cout << "destroying A" << std::endl;
}
};
int main()
{
std::cout << "1" << std::endl;
A::instance().foo();
std::cout << "2" << std::endl;
}
答案 3 :(得分:0)
Singleton Design patterns
表示该类中只有一个对象是可能的。
因此,要限制此条件,我们需要设置constructor as private
,以便不能在该类之外创建任何对象。
现在如果是这种情况,那么你将如何获得该对象。所以只有一种方法可以创建一个函数static
,以便可以使用类名访问它,并返回该类的对象。