0

我已经构建了 LOG4CXX 库和 DLL 并尝试在我的应用程序中使用它

Loh.h 
class Log
{
public:
 Log(void);
 ~Log(void);
 void Debug(const char *msg);

private:
static LoggerPtr  oLogger;
};

Log.cpp
LoggerPtr  oLogger = NULL;
Log::Log()
{
        LoggerPtr oLogger(Logger::getLogger("Test"));
    PropertyConfigurator::configure("Logger4CXX.properties");
}

void CLogger::Debug(const char *msg)
{
    if(oLogger != NULL)
    {
        LOG4CXX_DEBUG(oLogger,"Testing application...");    
    }
}

在我的主要中,我正在初始化 Log 类对象并调用 Debug 方法将调试消息记录到文件中。

我面临的问题是在if(oLogger != NULL),它总是将 oLogger 作为 NULL 返回。

任何人都可以提供任何帮助。

4

1 回答 1

0

在您的构造函数中,您创建名为 oLogger 的新本地(方法范围)变量,它会隐藏同名的类变量。这应该可以解决问题:

Log::Log()
{
    oLogger = new LoggerPtr(Logger::getLogger("Test"));
    PropertyConfigurator::configure("Logger4CXX.properties");
}

此局部变量在超出范围时(方法结束时)被销毁。

编辑:至于您对“不喜欢指针”的评论。您可以使用 取消引用它*oLogger,或者为了避免使用指针,您可以简单地跳过new关键字。

Edit2:这应该是最安全的方法,没有静态变量并保持 LoggerPtr 不变:

Log::Log() : oLogger(LoggerPtr(Logger::getLogger("Test"))
{
    PropertyConfigurator::configure("Logger4CXX.properties");
}

这称为初始化列表。

于 2013-11-18T08:55:57.050 回答