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;
}
以这种方式定义一堆常量被认为是错误的编程吗?
答案 0 :(得分:2)
不相关的课程经常使用它们,并且必须使用类名来限定它们。
这有什么问题?可以这样想:什么是更好的变量名nt
或num_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)
以这种方式定义一堆常量会被认为是错误的编程吗?
确实如此,你的第二个不相关的类使用来自另一个类的常量。这是一个紧密耦合的依赖。如果第一类由于某些原因而被修改以删除/重构常量,那么第二类也会受到影响。避免这种依赖。