从 C++ 开始,我编写了一段简单的代码,旨在用作(非常基本的)记录器。这主要是为了尝试重载运算符。
class Logger {
public:
Logger() : _has_logged_something(false) { };
template <typename T>
friend Logger& operator <<(Logger& logger, T const & value) {
logger._has_logged_something = true;
std::cerr << value;
return logger;
};
private:
bool _has_logged_something;
};
_has_logged_something
我需要记住实例变量中何时已经加载了某些内容。但是这条线在运行时非常有帮助Segmentation fault (core dumped)
。一定是一个明显的错误,但我无法理解。
--
编辑
因为这似乎不是这段代码的问题,所以这里是如何使用它来避免使用单例(可能不是最好的代码,但无论如何)。
#ifndef _BORDERS_COMMON_LOGGER_LOGGER_HH_INCLUDED
#define _BORDERS_COMMON_LOGGER_LOGGER_HH_INCLUDED
#include "common/log/logger.hh"
#include "common/log/event.hh"
namespace {
static borders::common::log::Logger* _global_logger = NULL;
}
namespace borders {
namespace common {
namespace log {
inline bool is_global_instance_initialized() {
return _global_logger != NULL;
};
inline Logger& get_global_instance() {
if (_global_logger == NULL) _global_logger = new Logger;
return *_global_logger;
};
} // namespace log
} // namespace common
} // namespace borders
#define LOG_INFO() (borders::common::log::get_global_instance())
#define LOG_START()
#define LOG_STOP() \
if (borders::common::log::is_global_instance_initialized()) \
delete &borders::common::log::get_global_instance(); \
else \
(void) 0;
#endif // _BORDERS_COMMON_LOGGER_LOGGER_HH_INCLUDED
鉴于我尝试使用以下方法运行它:
LOG_INFO() << "Foo" << "Bar"
再一次,当我注释掉我之前指出的行时,文本会写在控制台上。