代码之家  ›  专栏  ›  技术社区  ›  sud03r

在类中使用静态成员对象有什么问题?

  •  7
  • sud03r  · 技术社区  · 14 年前

    我听说使用静态成员对象不是一个很好的实践。

    class Foo {
    ...
    static MyString str;
    };
    

    我在此类的实现文件中定义并初始化此变量为:

    MyString Foo::str = "Some String"; // This is fine as my string API handles this.
    

    warning:'Foo::str' requires global construction.
    

    4 回复  |  直到 14 年前
        1
  •  10
  •   Yakov Galka    14 年前

    反对它们的大多数论据与全局变量相同:

    1. 不同编译单元之间的初始化顺序未定义。
    2. 如果一个构造函数抛出了一个你无法捕捉到的异常,你的程序将被终止。

    const char* Foo::str = "Some String"; ?

        2
  •  3
  •   aschepler    14 年前

    这个例子最重要的原因是构造静态成员对象之前发生过 main() 然后毁灭就会发生 (或者你打电话的时候 exit() ). 到目前为止,这是件好事。但是,当您的程序中有多个这样的对象时,您可能会遇到一个错误,即代码试图使用尚未构造或已被销毁的对象。

    some helpful discussion 包括解决方法/解决方案。建议阅读问题10.14到10.18。10.17最直接地适用于您的例子。

        3
  •  2
  •   t0mm13b    14 年前

        4
  •  1
  •   Chubsdad    14 年前

    例如,它需要知道一个类的实例数。这将需要一个类静态成员来跟踪实例计数。