7

假设我有一个 T 类

  1. T 没有虚函数。
  2. T 个实例没有状态。
  3. T 具有自身的静态成员实例。
  4. 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;
}
4

3 回答 3

2

我对您从包装在命名空间或类中的枚举中看到的优势感兴趣:

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;
于 2011-05-16T22:19:14.127 回答
2

要回答您问题的第一部分,如果T有一个具有副作用的构造函数,那么您实际上可能会被静态初始化惨败所烧毁。

于 2011-05-16T22:34:10.630 回答
0

您真的打算使用指针值来比较“状态”吗?我同意@Drew,这是一个有趣的想法。但是,如果我们假设这是一个仅标题的实现,我不确定标准是否保证它可以工作。

考虑当多个编译对象包含 和 的相同定义时会发生Switch::ON什么Switch::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;
}
于 2011-05-16T22:12:58.687 回答