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

时间:2011-10-09 12:17:25

标签: c++ class static constants

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;
}

以这种方式定义一堆常量被认为是错误的编程吗?

5 个答案:

答案 0 :(得分:2)

  

不相关的课程经常使用它们,并且必须使用类名来限定它们。

这有什么问题?可以这样想:什么是更好的变量名ntnum_toes?如果将类更改为命名空间,则使用类Human(或命名空间Human进一步限定名称是一件好事,而不是坏事。它有助于编译器,它可以帮助您作为编码器意外地与其他名称冲突,并帮助另一个试图理解您的代码的人。

关于名称NUM_FINGERS等:我建议不要使用ALL_CAPS。有一天,有人会写一个NUM_FINGERS宏,将你的代码变成乱码。为宏保留ALL_CAPS名称,然后尝试避免使用宏。

答案 1 :(得分:2)

假设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;
}

(其他回复关于脆弱性等的评论仍然有效。)

答案 2 :(得分:1)

这在某种程度上取决于具体情况。

常量与Human类相关,因此它们被“拥有”完全合理,并且使用命名空间名称(Human :: NUM_ARMS)使它们的用法明确无误。 (想象一下,如果你引入了新的类,如Octopus会发生什么。你会使用Octopus :: NUM_ARMS,它将是8而不是2。感谢良好的本地化类/命名空间名称!)

当然,在Human / Octopus情况下,您可能需要重新考虑使用常量,而是使用带有虚拟GetNumArms()方法的Animal类/接口,每个方法都可以覆盖。这将允许您的客户端代码仅与Human和Octopus松散耦合,并且适用于两种类型的Animal。这将允许底层常量对每个类都是私有的。

或者如果您在另一个方向编写代码,请考虑外部类正在计算的内容。这个计算应该由谁负责?也许您应该将计算添加到Human类(例如Human::GetNumLimbs()Human::GetNumBodyParts()

最后,我们已经从1970年代开始,所以我建议使用更易读的常量样式(例如Human::cNumFeet导致的眼睛出血少于Human::NUM_FEET,并且不会容易被误认为是你所处的任何宏)

答案 3 :(得分:0)

不,使用using namespace来平衡名称空间被认为是错误的编程,尤其是在全局范围内。如果它是X类中的常量,请写X::constant,否则您只是在阻碍可读性(以及命名冲突的风险)。

答案 4 :(得分:0)

  

以这种方式定义一堆常量会被认为是错误的编程吗?

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