这个预处理器指令在这里可以接受吗?

时间:2014-03-06 16:43:59

标签: c++ preprocessor-directive

有一个单Logger课,我觉得每次调用print方法都很难写Logger::GetInstance()。我能想到的唯一解决方案是#define。有什么更好的,或者在这种情况下这个宏是否合理?

#include <iostream>
#include <fstream>

class Logger
{
public:

    static Logger& GetInstance();
    ~Logger();
    template <typename T>
    void   Print(const T &t);
    void   SetNewline(bool b);
    void   SetLogging(bool b);

private:

    Logger();
    Logger(const Logger&);
    void operator=(const Logger&);

    bool newline;
    bool log;
    std::ofstream file;
};

int main()
{
    #define logger Logger::GetInstance()
    logger.Print("Hello");
    //Logger::GetInstance().Print("Hello");
}

2 个答案:

答案 0 :(得分:4)

请注意,由于您显然是在“本地”定义宏,因此宏不会考虑范围

为什么不直接定义函数而不是宏:

inline
auto logger() -> Logger& { return Logger::GetInstance(); }

然后你可以写

logger().Print( "Hello" );

答案 1 :(得分:3)

干杯和赫思的两种选择。 - 阿尔夫回答:

如果在范围内需要多次使用,可以给记录器一个名称:

Logger& logger = Logger::GetInstance();

// ...

logger.Print("Hello, world");

或者你也可以使记录方法保持静态:

static void Logger::Print(const T &t) {
   Logger::GetInstance().Print(t);
}

然后静静地打电话给他们:

Logger::Print("Hello world!");

您可能会争辩说,对于客户端,如果实际存在实例则无关紧要 - 构造函数是私有的,因此他们无论如何也无法创建自己的实例。因此静态方法是否创建实例应该不是他们关注的问题。在这种情况下,使用名为GetInstance的公共方法实际上暴露了不相关的实现细节。

相关问题