在实现单例时,为什么我们总是创建静态成员函数?

时间:2014-03-04 09:42:19

标签: c++ singleton

静态成员函数和常规成员函数都可以访问静态变量。但是,我看到静态成员函数通常被定义为getinstance()以获取静态变量Instance。为什么会这样?它背后有什么理由吗?我可以使用常规函数来获取静态变量实例。

4 个答案:

答案 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,以便可以使用类名访问它,并返回该类的对象。