使用类只是为了维护几个常量变量是个好主意吗?



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

class Logs
{
public:
    static const int DEBUG=0;
    static const int INFO=1000;
    static const int SOMETHING_ELSE=2000;
}

班上就是这样。没有别的。而不是按原样使用值,而是使用变量。示例:如果我想将严重性传递给某个辅助函数,那么它传递的不是传递 1000 作为其参数,而是传递Logs::INFO.

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

只是选择使用一个而不是另一个,还是一个比其他一个有具体的优势?

我们也可以使用enum

那将是我的首选,在Log范围内定义的enum

或宏。

绝对不是。宏不如积分变量有很多原因。

或常量全局变量。

不像宏那么糟糕,但它们不应该是首选。

或命名空间内的常量变量。

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

但为什么要上课呢?

在类范围内或namespace范围内定义的enum常量或整数常量之间的选择对我来说并不总是很清楚。您必须根据这些数字所代表的内容做出判断。在这种情况下,对我来说似乎可以使用:

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

Akhil 的观点,即使用 #define 是个好主意,原因有很多,其中最重要的是类型安全和后续代码重新定义值的可能性。

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

我会考虑尝试命名空间 - 命名空间的优点是不污染全局命名空间,并且可以与类似的语法(包括using语句和::语法(一起使用,但由于命名空间不是类,很少有人会假设这些值与特定对象相关联......这可能有助于其他人理解您的意图。

如上所述

,您也可以使用 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.
     };
 }

您可以像想要获得全局访问权限一样使用它

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

void functioncall_2(int)
{
   //do something
}
//function call will be
functioncall_2(DEBUG);

enum LOG {
    DEBUG,
    INFO = 1000,
    SOMETHING_ELSE = 2000,
} 
void functioncall_1(LOG)
{
    //do something
}
//function call will be
functioncall_1(DEBUG); // u can call it like LOG::DEBUG or DEBUG in the case of enum. 

根据我的意见更好的方式

相关内容

最新更新