【问题标题】:Can I return a reference to a static class (singleton) instance within that class in C++?我可以在 C++ 中返回对该类中的静态类(单例)实例的引用吗?
【发布时间】:2012-01-11 07:40:23
【问题描述】:

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

(这里不考虑线程安全。)

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;

【问题讨论】:

  • 通常当我实现一个单例时,我会做噩梦:P
  • 如果你也被告知不要使用单例......虽然也许这是一个测试?
  • @R.MartinhoFernandes 还有,小猫死了。
  • @Kerrek SB - 不,这不是测试。当我登录时,单身人士已经在代码库中,我的任务似乎符合这种模式。

标签: c++ singleton


【解决方案1】:

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

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 函数时被初始化。

【讨论】:

    【解决方案2】:

    是的,没有什么可以禁止您这样做。 你有没有尝试先编译

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

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

    【讨论】:

    • 是的,它可以编译,只是想知道是否有人能指出它有什么问题。哇,我没有意识到人们对单身人士如此失望!
    • 嗯,你真的需要考虑其他解决方案,直到你有充分的理由使用它们(有些人说没有,但我不同意)。此外,每个人对“单身”这个词的理解也不一样。例如,OGRE3D 库使用一个 Singleton 类来实现唯一实例的展示,使其在实践中“全局”,但不允许隐式创建/销毁:您必须显式编写创建和销毁以确保您管理实例生命周期。它不完全是 Singleton,但可以混合使用。
    【解决方案3】:

    是的,你可以做到。

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

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

    【讨论】:

      猜你喜欢
      • 2015-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-20
      相关资源
      最近更新 更多