Для регистрации ошибок у меня есть следующий код, который можно вызвать:
void writeErrorToLog(const LogMessage& message)
{
static std::ofstream logFile(ERROR_LOG_FILEPATH, std::ofstream::out | std::ofstream::trunc);
logFile << message.getLogMessage();
logFile.flush();
}
Поэтому после завершения работы программы файл журнала содержит все ошибки, которые произошли во время последнего запуска. Это работает нормально, если не было ошибок. В случае отсутствия ошибок файл журнала содержит ошибки запуска перед последним, так как из-за отложенной инициализации файл так и не был открыт (с параметром trunc). Любой способ заставить статическую переменную быть инициализированной?
Как насчет чего-то такого:
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(...)
Других решений пока нет …