Объект внутри класса становится NULL

Я собрал библиотеку 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.

Может ли кто-нибудь предложить какую-либо помощь по этому вопросу.

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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]