使用公共静态const类成员的声明

using declaration for public static const class members

本文关键字:成员 声明 const 静态      更新时间:2023-10-16

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::cNumFeetHuman::NUM_FEET导致的眼睛滴血少得多,并且不会轻易被误认为是你周围的任何宏)

不,扁平化命名空间被认为是糟糕的编程,即使用using namespace,特别是在全局作用域中。如果它是X类中的常量,则写入X::constant,否则您只是妨碍了可读性(并且有命名冲突的风险)。

以这种方式定义一堆常量是否被认为是糟糕的编程?

第二个不相关的类使用了来自另一个类的常量。这是一个紧密耦合的依赖项。如果由于某些原因修改了第一个类以删除/重构常量,那么第二个类也会受到影响。