C++ 在实现单例时,为什么我们总是使用静态成员函数?

C++ 在实现单例时,为什么我们总是使用静态成员函数?,c++,singleton,C++,Singleton,静态变量既可以由静态成员函数访问,也可以由常规成员函数访问。但是,我看到静态成员函数通常像getinstance()一样定义,以获取静态变量实例。为什么会这样?这背后有什么原因吗?我可以有一个正则函数,它也可以得到静态变量实例 要获取对象实例,需要调用函数;要调用函数,需要对象实例。除非它是静态函数。你的意思是“为什么它是静态成员而不是非成员”?因此它(a)在类内起作用,(b)可以访问私有构造函数和实例 如果你真的想让每个人的生活变得更艰难,你可以让它成为非会员。您需要给它一个更详细的名称(例如

静态变量既可以由静态成员函数访问,也可以由常规成员函数访问。但是,我看到静态成员函数通常像getinstance()一样定义,以获取静态变量实例。为什么会这样?这背后有什么原因吗?我可以有一个正则函数,它也可以得到静态变量实例

要获取对象实例,需要调用函数;要调用函数,需要对象实例。除非它是静态函数。

你的意思是“为什么它是静态成员而不是非成员”?因此它(a)在类内起作用,(b)可以访问私有构造函数和实例

如果你真的想让每个人的生活变得更艰难,你可以让它成为非会员。您需要给它一个更详细的名称(例如,
get\u instance\u of_whatever
,而不是
whatever::get\u instance
),并使其成为朋友,以便它可以访问并在必要时创建实例。让它成为一个静态成员会更简单

(我假设您的意思不是“为什么是静态的而不是非静态的”。显然,您不能在没有对象的情况下调用非静态成员,也不能在没有调用访问器函数的情况下访问对象。)


当然,您首先要实现一个单例;特别是在C++中,除了反模式的一般概念问题之外,它还导致了生命周期的雷场。

除了保存对象的实例外,单函数中静态函数的代码<代码>实例()/代码>是在调用时创建的。 假设构造函数和析构函数是公共的,您也可以创建全局变量或静态变量,但它是在进入

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;
}
#包括
结构A
{
静态A&实例()
{
静态A;
返回a;
}
void foo(){

std::cout
单例设计模式
表示该类只能有一个对象

因此,为了限制这种情况,我们需要将
构造函数设为private
,以便在该类之外不能创建任何对象


如果是这种情况,那么您将如何获得该对象。因此,只有一种可能性可以使函数
成为静态的
,这样就可以通过使用类名访问该函数,并返回该类的对象。

要使用非静态函数,您需要一个对象实例,如果您有多个对象实例,则不再有一个单例。+1只是为了“删除”这个“-1”投票-我不认为这个问题值得-1,它可能有点棘手,特别是对于初学者,甚至对于那些从未尝试实现和使用单例的人来说更是如此。@JoachimPileborg-我将此作为一个答案发布-简短、解释性强、清晰。