考虑到头文件中的以下内容,我有一个与命名空间有关的小问题:
namespace A {
namespace B {
void SetMemberValue(double value) { _member = value; }
double FunctionThatUsesMember(double a) { return a * _member; }
double AnotherFuncThatUsesMember(double a) { return a / _member; }
static double _member = 0.01;
}
}
我不希望用户能够更改_member
via的值A::B::_member = some_value
。在阅读了未命名的命名空间后,我将其更改为:
namespace A {
namespace B {
void SetMemberValue(double value) { _member = value; }
double FunctionThatUsesMember(double a) { return a * _member; }
double AnotherFuncThatUsesMember(double a) { return a / _member; }
namespace {
double _member = 0.01;
}
}
}
这会强制用户使用提供的 mutator 函数并且效果很好,除了一个问题:
如果用户继续使用:A::B::_member = some_value
代码没有编译、链接、运行失败;该语句被忽略,使用默认值0.01
可能导致运行时错误或“OMG WTF IS WRONG BBQ!!1!!” 时刻。(虽然我不确定,但声明没有失败可能是 MSVC++ 和 VS2010 的问题。)
问题:有没有办法让代码在A::B::_member = some_value
错误使用时以某种方式大声失败?