поток — C ++: как избавиться от ленивой инициализации

Для регистрации ошибок у меня есть следующий код, который можно вызвать:

void writeErrorToLog(const LogMessage& message)
{
static std::ofstream logFile(ERROR_LOG_FILEPATH, std::ofstream::out | std::ofstream::trunc);
logFile << message.getLogMessage();
logFile.flush();
}

Поэтому после завершения работы программы файл журнала содержит все ошибки, которые произошли во время последнего запуска. Это работает нормально, если не было ошибок. В случае отсутствия ошибок файл журнала содержит ошибки запуска перед последним, так как из-за отложенной инициализации файл так и не был открыт (с параметром trunc). Любой способ заставить статическую переменную быть инициализированной?

0

Решение

Как насчет чего-то такого:

class Log
{
private:
std::ofstream _logFile;
public:
Log()
: _logFile(ERROR_LOG_FILEPATH, std::ofstream::out | std::ofstream::trunc)
{
}

void writeErrorToLog(const LogMessage& message)
{
_logFile << message.getLogMessage();
_logFile.flush();
}
}

Затем вы можете использовать один экземпляр этого класса (применить шаблон синглтона). Каждый раз, когда создается экземпляр класса, он усекает файл независимо от того, есть ошибки или нет.

Вы также можете сделать статический член _logFile:

class Log
{
private:
static std::ofstream _logFile;
public:
static void writeErrorToLog(const LogMessage& message)
{
_logFile << message.getLogMessage();
_logFile.flush();
}
}

// In cpp
std::ofstream Log::_logFile(ERROR_LOG_FILEPATH, std::ofstream::out | std::ofstream::trunc);

Таким образом, вы можете просто получить к нему доступ так:

Log::writeErrorToLog(...)
1

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

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

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