2013-11-15 3 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...");  
    } 
} 

В моем основном я инициализацию объекта Log класса и вызов метод отладки для входа отладки сообщения в файл ,

Проблема, с которой я сталкиваюсь, находится в if(oLogger != NULL), которая всегда возвращает oLogger как NULL.

Может ли кто-нибудь помочь в этом.

+0

Вы не назначили 'Log :: oLogger' в любом месте. –

+0

@MarceloCantos В моем коде LoggerPtr oLogger (Logger :: getLogger («Тест»)); выполняет задачу присвоения значения 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 не любит pointered oLogger. Любые другие варианты? – user987316

+0

Ну, после второго взгляда на ваш код, кажется, что есть два класса: 'Log' и' CLogger'. В этом случае для этого потребуется доступ к переменной «Log :: oLogger» из метода класса CLogger без экземпляра «Log». Хотя я не уверен, что это то, что вы хотите, поскольку вы смешиваете классы в своем коде, что затрудняет понимание. – Losiowaty

+0

Я удалил путаную часть из фрагмента кода. Сейчас я в этом состоянии, я его использую. Loggerptr - это указатель объекта Log4CXX, DLL, который я использовал для ссылки. – user987316

Смежные вопросы