使用公共静态const类成员的声明
using declaration for public static const class members
Human定义了许多公共静态常量:
class Human
{
public:
static const int NUM_FINGERS = 10;
static const int NUM_TOES = 10;
static const int NUM_HANDS = 2;
static const int NUM_FEET = 2;
//The rest of the human class here
};
一个不相关的类经常使用它们,必须用类名限定它们:
class Unrelated
{
public:
int SomeFunction()
{
//Many uses of Human's public static constants
return Human::NUM_FINGERS + Human::NUM_TOES + Human::NUM_HANDS + Human::NUM_FEET;
}
};
对于命名空间,可以:
using namespace blah;
对于这种情况是否有等价的?
using namespace Human; //wrong
int Unrelated::SomeFunction()
{
return NUM_FINGERS + NUM_TOES + NUM_HANDS + NUM_FEET;
}
以这种方式定义一堆常量是否被认为是糟糕的编程?
一个不相关的类经常使用它们,并且必须用类名来限定它们。
这是怎么回事?这样想:哪个变量名更好,是nt
还是num_toes
?用类Human
进一步限定名称(如果将类更改为名称空间,则使用名称空间Human
)是一件好事,而不是坏事。它可以帮助编译器,它可以帮助你作为一个程序员意外地与其他名字冲突,它可以帮助另一个试图理解你的代码的人。
关于名称NUM_FINGERS
等:我建议不要使用ALL_CAPS。有一天,有人会写一个NUM_FINGERS
宏,把你的代码变成胡言乱语。为宏保留ALL_CAPS名称,然后尽量避免使用宏。
假设Unrelated
实际上是Unrelated_but_about_Humans
,您可以简单地说"我有与Human
相同的常量":
class Unrelated
{
private:
static const int NUM_FINGERS = Human::NUM_FINGERS;
static const int NUM_TOES = Human::NUM_TOES;
static const int NUM_HANDS = Human::NUM_HANDS;
static const int NUM_FEET = Human::_NUM_FEET;
}
(其他回复关于脆弱等的言论仍然有效)
这要视情况而定。
常量与Human类相关,因此它们被Human类"拥有"是完全有意义的,并且使用具有名称空间的名称(Human::NUM_ARMS)使它们的用法明确。(想象一下,如果你引入新的类,比如Octopus,会发生什么。您将使用Octopus::NUM_ARMS,它将是8而不是2。幸亏有了本地化的类/命名空间名称!)
当然,在Human/Octopus的情况下,您可能需要重新考虑使用常量,而是使用带有虚拟GetNumArms()方法的Animal类/接口,每个方法都可以重写。这将允许您的客户端代码仅与Human和Octopus松散耦合,并且对两种类型的Animal都能很好地工作。这将允许底层常量对这些类中的每个都是私有的。
或者,如果您从另一个方向编写代码,请考虑外部类正在计算什么。这个计算应该由谁负责?也许你应该将计算添加到Human类(例如Human::GetNumLimbs()
, Human::GetNumBodyParts()
)
最后,我们都从20世纪70年代开始,所以我建议使用更具可读性的常量样式(例如,Human::cNumFeet
比Human::NUM_FEET
导致的眼睛滴血少得多,并且不会轻易被误认为是你周围的任何宏)
不,扁平化命名空间被认为是糟糕的编程,即使用using namespace
,特别是在全局作用域中。如果它是X
类中的常量,则写入X::constant
,否则您只是妨碍了可读性(并且有命名冲突的风险)。
第二个不相关的类使用了来自另一个类的常量。这是一个紧密耦合的依赖项。如果由于某些原因修改了第一个类以删除/重构常量,那么第二个类也会受到影响。以这种方式定义一堆常量是否被认为是糟糕的编程?
- 使用静态成员声明类时遇到问题
- 错误 C2059:语法错误:从结构成员声明'constant'
- std::d eclare_if 或其他在编译时丢弃成员声明的假设方法
- C++ 成员声明中不允许使用限定名称
- 又一个"未找到成员声明"
- auto f = bind(dist<>,gen) 在成员声明C++失败。未被识别为函数
- C++错误:成员声明末尾的预期“;”
- 静态成员声明 c++11
- 如何将成员声明为指向外部"C"函数的指针?
- C++11 - 将非静态数据成员声明为 'auto'
- 类成员声明的快捷方式
- libclang 获取成员声明
- 将成员声明与enable_if一起使用
- 找不到成员声明
- C++错误:找不到成员声明
- 找不到c++成员声明
- 成员声明顺序在类中如果彼此依赖,则为最优解
- 将struct的成员声明为uint32_t时额外的字节
- 为什么类的大小取决于成员声明的顺序?以及如何
- 是成员声明`decltype(name)name;`在第一个名称引用封闭作用域的本地结构中允许