您将全局常量放在C ++应用程序中的哪个位置?例如,你会把它们放在一个班级吗?在结构?
答案 0 :(得分:13)
我会使用一个名称空间来表示与单个类没有很强关联的全局常量。在后一种情况下,我会把它们放在那个班级里。
真正的全局(应用程序级)常量应该在应用程序的命名空间中(假设你的应用程序在它自己的命名空间内,应该是这样)。对于模块级常量,模块自己的命名空间是自然的位置。
答案 1 :(得分:5)
最好的方法是将它们放在它们所属的同一命名空间中。大型C ++应用程序通常会有许多模块,每个模块都有自己的常量集。每个模块都应该在命名空间中,其中也包含常量。
答案 2 :(得分:2)
对于单个.cpp文件的本地常量,最好的方法是在匿名命名空间中声明它们,如下所示:
namespace {
int const seconds_per_minute = 60;
int const minutes_per_hour = 60;
}
对于需要对整个程序可见的常量,最简单的解决方案是为它们创建一个(命名的)namspace,并将其放在头文件中。
如果有(或可能)某些操作要与它们一起使用,那么您应该为它们创建一个singleton class。例如,我的程序有一个名为“configuration”的单例类很常见,它从配置文件或注册表中读取启动常量(类似于IP地址的东西,以及我不太想硬编码的东西)。那样的。
答案 3 :(得分:1)
作为一个简单的经验法则,我把它们放在任何地方都会导致它们没有刺激性的C风格前缀。
例如,如果你的常量被命名为mylib_foo
,mylib_bar
,那么它们应该在名称空间mylib中,并且是mylib::foo
和mylib::bar
。
如果命名空间mylib包含常量circle_max_radius
,sphere_max_radius
,rectangle_max_width
,rectangle_max_height
,其中Circle,Sphere和Rectangle是类,那么它们应该是静态类成员。
max
不是一个“刺激性”的前缀,它是一个非常明智的前缀,因为它是一个描述性修饰符而不是占有性(“圈子的最大半径”)。所以它可以留下来。
答案 4 :(得分:1)
一种可能的方法是使用具有返回常量的静态成员函数的类。当我需要的常量不仅仅是基本类型或简单对象时,我会使用它。
class Constant
{
public:
static const ComplexObject& getComplexObject()
{
static ComplexObject constObj = createComplexObject();
return constObj;
}
private:
static ComplexObject createComplexObject()
{
ComplexObject obj;
obj.setValue(1);
return obj;
}
}
答案 5 :(得分:0)
一个选项是将它们作为非静态成员放入类中,并将该类型的对象放在main()函数中。无论出于何种原因,当你发现自己需要时,这简化了使它们成为非全局
。