我可以在C ++中返回对该类中的静态类(单例)实例的引用吗?

时间:2012-01-10 23:17:15

标签: c++ singleton

通常当我实现单例时,我将实例设置为动态并具有成员函数来删除它。在这种情况下,我正在使用嵌入式设备,我被告知我不能使用动态内存。它对一个类在类声明中有自己的静态实例是有效的,并通过引用返回它吗?

(此处不关注线程安全性。)

class Foo {
private:
    static Foo singleton;

    Foo() { }
    Foo(const Foo &rhs);
    Foo &operator=(const Foo &rhs);

public:
    inline static Foo &Instance(void) {
        return singleton;
    }
};

Foo Foo::singleton;

3 个答案:

答案 0 :(得分:12)

可能有一个静态实例,但不希望它在类级别上,因为它可能会在访问时尚未初始化(由于未完全定义的静态初始化顺序)。相反,你应该使用函数本地静态:

class Foo {
private:
    Foo() { }
    Foo(const Foo &rhs);
    Foo &operator=(const Foo &rhs);

public:
    inline static Foo &Instance(void) {
        static Foo singleton;
        return singleton;
    }
};

这样可以保证在第一次调用Instance函数时进行初始化。

答案 1 :(得分:2)

是的,没有禁止你这样做。 您是否尝试先编译

此外,类声明中定义的成员函数不需要内联。 另一方面,请确保您了解使用Singleton的含义(这很少是一个好主意,但在某些特定情况下可能有用 - 这是一个辩论主题,但实用主义总是赢得最终)。另外read this, answers and comments.经验将有助于更好地考虑用例。如果你实现单例模式,请永远不要允许隐式创建/销毁。

谈到这个主题,有一个Singularity库被提议用于提升(http://boost.org你的标准库补充),它们分别提供功能:1。只强制一个实例2.可选择使其可以全局访问 它在那里可用:https://github.com/icaretaker/Singularity(文档在源代码中......)

答案 2 :(得分:1)

是的,你可以做到。

但请注意,不能保证在编译单元中创建和销毁静态对象的顺序。因此,最好在静态存取器成员函数中声明静态。

出于同样的原因,您应该注意不要在不同的编译单元中跨多个单例类(或其他具有静态实例的类)引入初始化顺序依赖性。