我使用出色的Poco框架进行日志记录。当前,我在头文件中定义了Logger和LogStream:
#Foo.h
....
class Foo
{
private:
Poco::Logger &logger = Poco::Logger::get("Foo");
Poco::LogStream logStream{ logger };
};
直到我开始使用boost::di为止,这一直很好。当我使用增压注入(inject)器像这样为Foo创建对象时,
injector.create<Foo>();
我收到一个编译器错误消息,
但是,如果删除LogStream定义,则不会出现编译器错误。是否可以在 header 中声明LogStream而不定义它?我对C++还是很陌生,如果有人能指出我在这里做错了什么以及如何正确做对,我会感到很高兴。非常感谢你。
最佳答案
由于以下两个原因,无法复制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
。