无状态类的C ++静态初始化

假设我有一个类T在哪里

  • T没有虚拟功能。
  • T实例没有状态。
  • T有自己的静态成员实例。
  • T本身没有其他国家。
  • C ++静态初始化失败可以毁掉我的程序吗? 我不这么认为,因为即使其中一个静态实例在使用之前未被初始化,也不应该担心,因为T对象是无状态的。

    我有兴趣为类枚举类做这样的事情:


    // Switch.h
    
    class Switch {
    public:
        static Switch const ON;
        static Switch const OFF;
        bool operator== (Switch const &s) const;
        bool operator!= (Switch const &s) const;
    private:
        Switch () {}
        Switch (Switch const &); // no implementation
        Switch & operator= (Switch const &); // no implementation
    };
    

    // Switch.cpp
    
    Switch const Switch::ON;
    Switch const Switch::OFF;
    
    bool Switch::operator== (Switch const &s) const {
        return this == &s;
    }
    
    bool Switch::operator!= (Switch const &s) const {
        return this != &s;
    }
    

    要回答你的问题的第一部分,如果T有一个有副作用的构造函数,那么你实际上可以通过静态初始化失败而被烧毁。


    我感兴趣的是你看到的优点是什么,比如说,包含在命名空间或类中的枚举:

    namespace Switch {
       enum Switch {
          ON,
          OFF
       };
    }
    

    在大多数情况下使用它会更简单(在你的实现中你需要用户使用引用或指针,因为对象是不可复制的),它需要更少的代码(不需要禁用构造函数并创建操作符)。 ..

    事实上,在即将到来的标准中,即使没有使用名称空间,您几乎可以免费获得该标准:

    enum Switch {
       ON,
       OFF
    };
    // bad, it allows this (as in the current standard):
    Switch s = ON;
    // good, it does also allow explicit qualification:
    Switch s = Switch::ON;
    

    你真的打算使用指针值来比较“状态”吗? 我同意@德鲁,这是一个有趣的想法。 不过,我不确定标准是否能够保证它能够正常工作,但是,如果我们假设这是一个只有标题的实现。

    考虑当多个编译对象包含相同的Switch::ONSwitch::OFF定义时会发生什么情况。 由于这些是变量,而不是函数,链接器必须在它们之间任意决定。

    当您进行测试时,流行的编译器会说什么:gcc 3,gcc 4,microsoft c ++ 2005,2008和2010,以及Edison Design Groups的编译器之一,如http://www.comeaucomputing.com/?

    所述测试将包括:

    // Switch.h
    class Switch {
    public:
        static Switch const ON;
        static Switch const OFF;
        bool operator== (Switch const &s) const;
        bool operator!= (Switch const &s) const;
    private:
        Switch () {}
        Switch (Switch const &); // no implementation
        Switch & operator= (Switch const &); // no implementation
    };
    
    Switch const Switch::ON;
    Switch const Switch::OFF;
    
    bool Switch::operator== (Switch const &s) const {
        return this == &s;
    }
    
    bool Switch::operator!= (Switch const &s) const {
        return this != &s;
    }
    

    // main.cpp
    #include "Switch.h"
    
    extern int another_test();
    
    int main(int argc, char*argv[])
    {
      another_test();
      const Switch& current_state = Switch::ON;
      const Switch& another_state = Switch::OFF;
      if (current_state == another_state) {
        return 1;
      } else if (current_state != another_state) {
        return 2;
      }
      return another_test();
    }
    

    // another_test.cpp
    #include "Switch.h"
    
    int another_test()
    {
      const Switch& current_state = Switch::ON;
      const Switch& another_state = Switch::OFF;
      if (current_state == another_state) {
        return 4;
      } else if (current_state != another_state) {
        return 5;
      }
      return 6;
    }
    
    链接地址: http://www.djcxy.com/p/52761.html

    上一篇: C++ static initialization of stateless class

    下一篇: How does one implement a Hadoop Mapper in Scala 2.9.0?