无状态类的C ++静态初始化
假设我有一个类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::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;
}
链接地址: http://www.djcxy.com/p/52761.html