2013-11-15 1 views
0
나는 파일에 디버그 메시지를 기록하는 LOG4CXX lib 디렉토리 및 DLL 내 주요 내가 초기화하고 로그 클래스 객체에서 내 응용 프로그램

개체가됩니다 NULL

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

에서 사용하려고 및 호출 디버그 방법을 구축

.

문제 나는 항상 oLogger를 NULL로 반환하는 if(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 키워드를 건너 뛸 수 있습니다.

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

이가 초기화리스트라고 :

Edit2가 : 당신이 그것을 가지고 이것은 정적 및 LoggerPtr을 유지하지 않고, 가장 안전한 방법이 될 것이다.

+0

이것은 oLogger가 NULL이되는 문제를 해결할 수 있습니다. 하지만 oLogger를 정적 LoggerPtr * oLogger로 정의해야합니다. LOG4CXX_DEBUG 메소드는 oLogger를 좋아하지 않습니다. 다른 옵션은 없습니까? – user987316

+0

글쎄, 코드를 다시 살펴보면, 거기에는 두 개의 클래스가있는 것으로 보인다 :'Log'와'CLogger'. 이 경우 'Log :: oLogger' 변수에'Log'의 인스턴스없이 CLogger 클래스 메쏘드에서 접근하는 것은 이것을 요구합니다. 비록 이것이 당신이 원하는 것이라면 나는 확신 할 수 없지만, 코드에서 클래스를 혼합하면 이해하기가 더 어렵습니다. – Losiowaty

+0

코드 스 니펫에서 혼동스러운 부분을 제거했습니다. 그것은 지금 내가 그것을 사용하고있는 정확한 상태에 있습니다. Loggerptr Log4CXX 객체 포인터입니다. DLL은 참조 용으로 사용했습니다. – user987316