Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 静态类常量与常量的命名空间_C++ - Fatal编程技术网

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好吧,没错:)