我遇到了一个用于记录机制的代码,其中根据严重性打印消息。 因此,如果严重性设置为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.
我的问题是,为什么我们真的需要一个类来定义这些const变量。 我们也可以使用枚举。或者宏。或const全局变量。或命名空间内的const变量。但为什么课?使用类比我提到的其他选项有什么好处吗?
使用一个是另一个还是一个具有比其他人更具优势的选择是否只是选择问题?
答案 0 :(得分:1)
我们也可以使用
enum
。
这可能是我的第一选择,enum
在Log
的范围内定义。
或Macros。
绝对不是。由于许多原因,宏不如积分变量。
或const全局变量。
没有宏那么糟糕,但它们不应该是首选。
或命名空间内的const变量。
这也是一种可能性。即使在这里,我也建议使用enum
。
但为什么上课呢?
在enum
范围内或namespace
范围内定义的class Logs
{
public:
enum MessageType {DEBUG=0, INFO=1000, SOMETHING_ELSE=2000};
}
或整数常量之间的选择对我来说并不总是很清楚。您必须根据这些数字代表的内容进行判断。在这种情况下,我似乎可以使用:
if (handler instanceof HandlerMethod) {...}
答案 1 :(得分:0)
我不同意Akhil的观点,使用#define
是一个好主意,原因有很多,其中最重要的是类型安全性以及后续代码重新定义该值的可能性。 / p>
如果目的是限制对这些常量的访问(或者方便子类访问它们),那么将它们包含在类中当然是一种选择,但如果你打算将它们公开,那么我认为使用上课可能不是你最好的选择。
我会考虑尝试命名空间 - 命名空间的优点是不会污染全局命名空间,并且可以使用类似的语法(包括using
语句和::
语法),但由于命名空间不是少数几个人会认为这些值与特定对象相关联......这可能有助于其他人理解你的意图。
如上所述,您也可以使用枚举,但这只适用于整数值。简单地声明值还有另一个好处 - 您可以在外部声明它们,以防您想要在另一个文件中实际定义值。
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.
};
}
答案 2 :(得分:-2)
您可以像使用全局访问一样使用它
#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.
根据我的意见更好的方式