gpt4 book ai didi

c++ - 从其他不相关的类中使用 C++ Log 类

转载 作者:行者123 更新时间:2023-11-28 06:04:59 24 4
gpt4 key购买 nike

我有一个 C++ Log 类(实现很长而且可能不重要),我在其中重载了 << 运算符,因此我可以使用像 log << "Error" << endl; 这样的语句使其更直观(并允许我将输出 fork 到屏幕和日志,如果需要的话)。该类(class)效果很好;我在 Main() 中实例化它并且可以毫无问题地使用它。我希望能够在其他不相关的类中使用它,而无需实际将它传递给它们(通过类构造函数或类似方法),因为如果我通过拷贝传递,我最终会运行某些内务处理日志类方法两次,如果我通过引用传递,我必须取消引用外部类中的指针才能使用它(*log << "Error" << endl;)。这可能吗?最好的方法是什么?

最佳答案

使用以下声明创建一个全局函数:

Log& log();

它的实现看起来像这样:

Log& log()
{
static Log log;
return log;
}

或者像这样,避免销毁顺序问题(这可能发生在另一个具有静态存储持续时间的对象的析构函数向日志写入内容时):

Log& log()
{
static Log* log = new Log; // never deleted
return *log;
}

然后您可以使用与以前几乎相同的语法来使用您的记录器:

#include "log.h"

// ...

void f()
{
log() << "Error\n";
}

与单例方法相比,这有两个优点:

  • 更简单。
  • 它将日志类(写入日志消息)的实际关注与特定的分配策略分开。

顺便...

because if I pass by copy, I end up running certain housekeeping log class methods twice

不清楚你的意思,但是如果你通过复制,那么这个类需要是可复制的,复制一个封装或访问外部资源的记录器通常没有意义。这就是标准流类(std::ostream 等)不可复制的原因。

and if I pass by reference, I have to dereference the pointer in the external classes to use it

没有。您混淆了指针和引用。它们是完全不同的语言特征。解引用是针对指针,而不是引用。

关于c++ - 从其他不相关的类中使用 C++ Log 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32567063/

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