Я собрал библиотеку 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.
Может ли кто-нибудь предложить какую-либо помощь по этому вопросу.
В вашем конструкторе вы создаете новую локальную (общедоступную) переменную с именем 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");
}
Это называется списком инициализаторов.
Других решений пока нет …