2013-11-15 80 views
0

我已經建立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類對象並調用調試方法來記錄調試消息到文件。

我正面臨的問題是在if(oLogger != NULL),它始終將oLogger作爲NULL返回。

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

+0

你還沒有在任何地方分配'Log :: oLogger'。 –

+0

@MarceloCantos在我的代碼LoggerPtr oLogger(Logger :: getLogger(「Test」));正在完成將oLogger分配給其值的任務。 – user987316

+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"); 
} 

這就是所謂的初始化列表。

+0

這可能會解決我的問題,oLogger變爲NULL。但它要求oLogger被定義爲靜態LoggerPtr * oLogger;而LOG4CXX_DEBUG方法不喜歡指針式oLogger。任何其他選項? – user987316

+0

那麼,在第二次查看代碼之後,看起來有兩個類:'Log'和'CLogger'。在這種情況下,如果沒有Log的實例,從CLogger類方法訪問'Log :: oLogger'變量就需要這個。雖然我不確定這是否是你想要的,但是當你在你的代碼中混合類時會讓它更難理解。 – Losiowaty

+0

我已經從代碼片段中刪除了令人困惑的部分。現在我正在使用它。 Loggerptr是一個Log4CXX對象指針,它的DLL用於引用。 – user987316