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

C++ 我可以在C+;中返回对该类中的静态类(单例)实例的引用吗+;?,c++,singleton,C++,Singleton,通常,当我实现一个单例时,我会使实例成为动态的,并有一个成员函数来删除它。在这种情况下,我在一个嵌入式设备上工作,有人告诉我不能使用动态内存。类在类声明中拥有自身的静态实例并通过引用返回它是否有效 (此处不考虑螺纹安全。) 是的,没有什么禁止你这样做。你试过先编译吗 此外,类声明中定义的成员函数不需要内联。 另一方面,请确保您理解使用单例的含义(这很少是一个好主意,但在某些特定情况下可能有用-这是一个辩论主题,但实用主义最终总是获胜)。经验也将有助于更好地考虑用例。如果您实现了单例模式,请不要允

通常,当我实现一个单例时,我会使实例成为动态的,并有一个成员函数来删除它。在这种情况下,我在一个嵌入式设备上工作,有人告诉我不能使用动态内存。类在类声明中拥有自身的静态实例并通过引用返回它是否有效

(此处不考虑螺纹安全。)


是的,没有什么禁止你这样做。你试过先编译吗

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

谈到这个主题,有一个Singularity库被提议用来提升(您的标准库补遗),它分别提供以下特性:1。仅强制执行一个实例2。(可选)使其可全局访问
它在那里可用:(文档在源代码中…

可以有一个静态实例,但不希望在类级别有它,因为它可能在访问时还没有初始化(由于没有完全定义静态初始化顺序)。相反,您应该使用函数local static:

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

public:
    inline static Foo &Instance(void) {
        static Foo singleton;
        return singleton;
    }
};
通过这种方式,可以保证在第一次调用
实例
函数时对其进行初始化。

是的,您可以这样做

但是请注意,对于跨编译单元创建和销毁静态对象的顺序没有任何保证。因此,最好在静态访问器成员函数中声明静态


出于同样的原因,您应该小心不要在不同编译单元的多个单例类(或具有静态实例的其他类)之间引入初始化顺序依赖关系。

此外,。通常,当我实现单例时,我会有一个噩梦:仅PIf还告诉您不要使用单例。。。虽然这可能是一个测试?@R.MartinhoFernandes,小猫也会死。@Kerrek SB-不,这不是一个测试。当我登录时,Singleton已经在代码库中,我的任务似乎符合这个模式。是的,它是编译的,只是想知道是否有人能指出它有什么问题。哇,我没意识到人们对单身一族如此不满!你真的需要考虑其他的解决方法,直到你有充分的理由去使用它们(有些人说,除了我不同意,没有其他的)。此外,“单身”一词对每个人的理解也不尽相同。例如,OGRE3D库使用一个单例类来实现对唯一实例的展示,使其在实践中成为“全局”的,但不允许隐式创建/销毁:您必须显式地编写创建和销毁,以确保管理实例生命周期。它不完全是单身,但可以混合。
class Foo {
private:
    Foo() { }
    Foo(const Foo &rhs);
    Foo &operator=(const Foo &rhs);

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