【问题标题】:How to declare and define Poco Logger?如何声明和定义 Poco Logger?
【发布时间】:2019-11-25 19:38:08
【问题描述】:

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

#Foo.h

....

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

}; 

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

injector.create<Foo>();

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

试图引用已删除的函数

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

【问题讨论】:

  • 可能你的Foo 实例被复制了,但是Poco::LogStream 的基类是std::ostream 这是不可复制的,所以你的Foo 实例不能被复制。为避免此问题,您可以将 logStream 设为某种智能指针、std::shared_ptrPoco::SharedPtr
  • 感谢@rafix07 抽出宝贵的时间写出来。我会试试你的建议。
  • 您不需要将Poco::Logger &amp;logger 存储为此类的数据成员(无法复制引用,因此无法生成默认的复制赋值运算符)。你可以做Poco::SharedPtr&lt;Poco::LogStream&gt; logStream{new Poco::LogStream(Poco::Logger::get("Foo"))};。调用 Logger::get 并将返回值传递给 Poco::LogStream ctor。
  • 嗨@rafix07,使用“new”时不会自动管理内存,是吗?我们需要在 dtor 中使用“删除”吗?
  • 嗨,SharedPtr 控制着LogStream 的生命周期,你不要手动操作。

标签: c++ logging boost poco-libraries


【解决方案1】:

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

1)logger是引用,引用必须在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

【讨论】:

  • 如果改用std:shared_ptr会有影响吗?
  • 您可以在这里轻松使用std::shared_ptr。没有区别。
  • 非常感谢@rafix07。效果很好。
猜你喜欢
  • 1970-01-01
  • 2019-02-26
  • 1970-01-01
  • 2013-05-28
  • 2011-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多