如何声明和定义Poco Logger?

时间:2019-07-17 02:50:18

标签: 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之前,这一直很好。当我使用增压注射器像这样为Foo创建对象时,

injector.create<Foo>();

我收到一个编译器错误,说

  

试图引用已删除的功能

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

1 个答案:

答案 0 :(得分:1)

Foo的实例由于以下两个原因而无法复制:

1)logger是引用,创建Foo时必须初始化引用,因此唯一的方法 为此,要使用构造函数。 编译器无法生成副本分配操作。因此Foo f1,f2; f1 = f2;无法正常工作。

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

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

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

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