C++:如何摆脱惰性初始化
C++: How to get rid of lazy initialization
要记录错误,我可以调用以下代码:
void writeErrorToLog(const LogMessage& message)
{
static std::ofstream logFile(ERROR_LOG_FILEPATH, std::ofstream::out | std::ofstream::trunc);
logFile << message.getLogMessage();
logFile.flush();
}
因此在程序关闭后,日志文件包含最后 运行 期间发生的所有错误。这工作正常,除非没有发生错误。在没有错误的情况下,日志文件包含最后一个之前 运行 的错误,因为延迟初始化,文件从未打开(使用 t运行c 选项)。有什么方法可以强制初始化静态变量?
怎么样:
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();
}
}
然后您可以使用此 class 的单个实例(应用单例模式)。每当实例化 class 时,无论是否有错误,它都会截断文件。
您还可以将 _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(...)
要记录错误,我可以调用以下代码:
void writeErrorToLog(const LogMessage& message)
{
static std::ofstream logFile(ERROR_LOG_FILEPATH, std::ofstream::out | std::ofstream::trunc);
logFile << message.getLogMessage();
logFile.flush();
}
因此在程序关闭后,日志文件包含最后 运行 期间发生的所有错误。这工作正常,除非没有发生错误。在没有错误的情况下,日志文件包含最后一个之前 运行 的错误,因为延迟初始化,文件从未打开(使用 t运行c 选项)。有什么方法可以强制初始化静态变量?
怎么样:
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();
}
}
然后您可以使用此 class 的单个实例(应用单例模式)。每当实例化 class 时,无论是否有错误,它都会截断文件。
您还可以将 _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(...)