c++ - 如何声明和定义Poco Logger?

标签 c++ logging boost poco-libraries

我使用优秀的 Poco 框架进行日志记录。目前,我在头文件中这样定义 Logger 和 LogStream:

#Foo.h

....

class Foo
{
    private:
        Poco::Logger &logger = Poco::Logger::get("Foo");
        Poco::LogStream logStream{ logger };

}; 

在我开始使用 boost::di 之前,它一直很好用.当我像这样使用 boost 注入(inject)器为 Foo 创建一个对象时,

injector.create<Foo>();

我收到一个编译器错误提示,

attempting to reference a deleted function

但是,如果我删除 LogStream 定义,则不会出现编译器错误。是否可以在header中声明LogStream而不定义它?我是 C++ 的新手,如果有人能指出我在这里做错了什么以及如何正确做,我会很高兴。非常感谢。

最佳答案

Foo 的实例无法复制,原因有二:

1) logger是reference,reference必须在Foo创建时初始化,所以唯一的办法 要做到这一点是使用构造函数。 编译器无法生成复制赋值操作。所以 Foo f1,f2; f1 = f2; 无法工作。

2) LogStream 的基类是 std::ostream,它禁用了复制操作。

解决方法: 删除作为数据成员的logger,这里是多余的, 因为我们可以在初始化 LogStream 时调用 Poco::Logger

class Foo {
    //...
    Poco::SharedPtr<Poco::LogStream> logStream{
        new Poco::LogStream(Poco::Logger::get("Foo"))};
};

要使 Foo 可复制,您可以使用 Poco::SharedPtr

关于c++ - 如何声明和定义Poco Logger?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57067898/

相关文章:

python - Boost.python 构建

c++ - 查找文件末尾的问题?

python - 使用Python解析日期时间范围之间的日志

java - Logback - 如何通过配置文件设置滚动日志的新开始和新的一天

jakarta-ee - LOG4J - EAR 中不同 war 的独立日志文件

c++ - 高效分组重叠矩形

c++ - 将 boost 类型删除类型转换回原始类型给我 boost::bad_any_cast

c++ - 删除 std::string 上的反斜杠字符时出现问题

c++ - 未报告的错误 VS 2015 : Hex char specifier

c++ - 杂乱的函数指针 : how to remove the warning?