C++ 静态类常量与常量的命名空间
假设您想用一个类的公共名称实例化“特殊”案例。让我们以下面定义的类颜色为例:C++ 静态类常量与常量的命名空间,c++,C++,假设您想用一个类的公共名称实例化“特殊”案例。让我们以下面定义的类颜色为例: struct Color { float r, g, b; constexpr Color(float r, float g, float b) : r(r), g(g), b(b) {} }; 想象一下,我们想要以某种有组织的方式定义常量,比如“红色”、“蓝色”,等等。我遇到了两种定义它们的方法: 1) 作为颜色类内的静态常量,例如Color::RED,Color::GREEN 2) 在名为类复数形
struct Color {
float r, g, b;
constexpr Color(float r, float g, float b) : r(r), g(g), b(b) {}
};
想象一下,我们想要以某种有组织的方式定义常量,比如“红色”、“蓝色”,等等。我遇到了两种定义它们的方法:
1) 作为颜色类内的静态常量,例如Color::RED
,Color::GREEN
2) 在名为类复数形式的命名空间中:
namespace Colors{
constexpr Color RED(1, 0, 0);
/* ETC */
}
因此,它们被访问为Colors::RED
Colors::BLUE
我发现第二个更容易维护,因为它每个元素只需要一个定义,而第一个需要两个声明,一个在类内部,另一个在类外部。然而,我不确定它的正确性
简言之:我想问的是,第二种方法是否正确,或者我是否应该选择第一种方法或任何其他方法。我指的不是它是否编译,而是它是否编译。我说的是好的设计实践。完全取决于您 就个人而言,每当我添加一个新的“预置”时,我不想改变类定义。因此,除非类的实现本身需要这些常量,否则我会将它们排除在外 但是,您不能将名称空间作为模板参数传递,因此有时(在更复杂的场景中)您会被一个类“卡住”。不过,这不一定是类
Color
第一个需要两个声明,一个在类内部,另一个在类外部
从C++17开始,这不再是事实 完全由你决定 就个人而言,每当我添加一个新的“预置”时,我不想改变类定义。因此,除非类的实现本身需要这些常量,否则我会将它们排除在外 但是,您不能将名称空间作为模板参数传递,因此有时(在更复杂的场景中)您会被一个类“卡住”。不过,这不一定是类
Color
第一个需要两个声明,一个在类内部,另一个在类外部
从C++17开始,这不再是事实 为什么你认为正确性有问题?除非您告诉我们您的假设是什么,否则我们无法反驳这一点。我觉得第二种方法(名称空间)更好、更易于维护。一些文档工具,如doxygen,将无法将名称空间对象与相关类分组。@ArtCarbody这不是失败;这是意料之中的行为。为什么要将他们与班级分组?名称空间是一个组。为什么您认为正确性有问题?除非您告诉我们您的假设是什么,否则我们无法反驳这一点。我觉得第二种方法(名称空间)更好、更易于维护。一些文档工具,如doxygen,将无法将名称空间对象与相关类分组。@ArtCarbody这不是失败;这是意料之中的行为。为什么要将他们与班级分组?命名空间是一个组。您不能在其内部内联类的实例,它不会编译。您可以将其内联到外部重新声明中。但是,它还需要相同预设的两个声明,因此它与解决方案相比没有优势#1@oierlauzi好的,这是真的:)您不能在类本身中内联类的实例,它不会编译。您可以将其内联到外部重新声明中。但是,它还需要相同预设的两个声明,因此它与解决方案相比没有优势#1@oierlauzi好吧,没错:)