Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.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++_Design Patterns - Fatal编程技术网

C++ 仅仅使用类来维护几个常量变量是一个好主意吗

C++ 仅仅使用类来维护几个常量变量是一个好主意吗,c++,design-patterns,C++,Design Patterns,我遇到了一个日志记录机制的代码,根据严重性打印消息。 因此,如果严重性设置为0,则打印调试日志;如果为1000,则仅打印信息日志等 class Logs { public: static const int DEBUG=0; static const int INFO=1000; static const int SOMETHING_ELSE=2000; } 课堂上就是这样。没有别的了。 使用变量,而不是按原样使用值。 示例:如果我想将严重性传递给某个helper函数,

我遇到了一个日志记录机制的代码,根据严重性打印消息。 因此,如果严重性设置为0,则打印调试日志;如果为1000,则仅打印信息日志等

class Logs
{
public:
    static const int DEBUG=0;
    static const int INFO=1000;
    static const int SOMETHING_ELSE=2000;
}
课堂上就是这样。没有别的了。 使用变量,而不是按原样使用值。 示例:如果我想将严重性传递给某个helper函数,那么它将传递
Logs::INFO.

我的问题是,为什么我们真的需要一个类来定义这些常量变量呢。 我们也可以使用枚举。或者宏。或常量全局变量。或名称空间中的常量变量。但是为什么要上课呢?与我提到的其他选项相比,使用类有什么优势吗


这仅仅是一个选择的问题,还是一个比另一个更具优势?

如果你想获得全球访问权,你可以像这样使用它

#define DEBUG 0
#define INFO 1000
#define SOMETHING_ELSE 2000


void functioncall_2(int)
{
   //do something
}

//function call will be
functioncall_2(DEBUG);

根据我的意见,更好的方法

我们也可以使用
enum
s

这将是我的第一选择,在
Log
范围内定义的
enum

或者宏

绝对不是。宏由于许多原因不如整数变量

或常量全局变量

没有宏那么糟糕,但它们不应该是首选

或名称空间中的常量变量

这也是一种可能性。即使在这里,我也建议使用
enum

但是为什么要上课呢

在类的作用域或命名空间的作用域中定义的
枚举
或整型常量之间进行选择,我并不总是很清楚。你必须根据这些数字所代表的内容做出判断。在这种情况下,我认为可以使用:

class Logs
{
   public:
    enum MessageType {DEBUG=0, INFO=1000, SOMETHING_ELSE=2000};
}

我不同意Akhil的观点,即使用
#define
是一个好主意,原因有很多,不仅仅是类型安全性和后续代码重新定义值的可能性

如果目的是限制对这些常量的访问(或者方便子类访问它们),那么将它们包含在类中当然是一种选择,但是如果您计划将它们公开,那么我认为使用类可能不是您的最佳选择

我会考虑尝试名称空间-命名空间的优点是不污染全局命名空间,并且可以使用类似的语法(包括<代码>使用< /COD>语句和<代码>::语法),但是由于命名空间不是一个类,很少有人会认为这些值与特定的对象相关。这可能有助于其他人理解你的意图

如上所述,您也可以使用enum,但这只适用于整数值。简单地声明值还有另一个优点——您可以在外部声明它们,以防您想要在另一个文件中实际定义值

namespace NyNamespace {
     const int kMyValue = 5; // Can be referenced as MyNamespace::kMyValue, or benefit from a 'using' statement.
     extern const int kDefinedElsewhere; // Can be declared here and defined elsewhere.
     const float kMyFloatValue = 5.f; // Not limited to integers.
     enum {
         kMyEnumValue = 5 // Limited to integer values.
     };
 }

枚举在这里更有意义。也许是为了说明
INFO
在逻辑上连接到
Logs
Deleisha,如果是这种情况,那么您可以在设计阶段更改命名约定本身。您可以将其分别更改为loggerDebug、loggerInfo和loggerXyz,而不是DEBUG和INFO以及某些XYZ变量。但是在C++中保持它的静态并声明静态const是我无法理解的。<代码>定义为应该是C++中的最后选择,只有当你真的必须做一些不能用其他方法完成的事情时才使用。在这种特殊情况下,使用
#define
似乎特别糟糕,因为像
DEBUG
INFO
这样的常用名称很容易发生冲突。
namespace NyNamespace {
     const int kMyValue = 5; // Can be referenced as MyNamespace::kMyValue, or benefit from a 'using' statement.
     extern const int kDefinedElsewhere; // Can be declared here and defined elsewhere.
     const float kMyFloatValue = 5.f; // Not limited to integers.
     enum {
         kMyEnumValue = 5 // Limited to integer values.
     };
 }