gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 04:45:49 30 4
gpt4 key购买 nike

我使用优秀的 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/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com