类中的对象变为NULL

时间:2013-11-15 09:40:52

标签: c++ log4net log4cxx

我已经构建了LOG4CXX lib和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。

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

1 个答案:

答案 0 :(得分: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");
}

这称为初始化列表。