0

假设我有一个主窗口。主窗口有一些子窗口,包括一个记录发生情况的日志窗口和一些操作用户数据的操作窗口。在操作窗口中的每一个操作之后,我都想在日志窗口中进行记录。有几种方法可以实现它。

  1. 在操作窗口中放置一个指向日志窗口的指针。为此,我认为操作窗口不是那么可重用,因为它绑定到一个指针。有一天,如果我不想记录,我需要删除它。此外,这种方式可能会占用更多内存。另外,如果操作窗口是主窗口的child's childe's child...,我需要把里面的指针一一传递。

  2. 将主窗口设为单例,并为其添加公共日志功能。当我需要记录时,我只需调用 MainWindow::Inheritance()->Log(theInformation)。但是如果有一天我有 2 个主窗口会发生什么。

对这个问题有什么好的建议。非常感谢!

4

3 回答 3

1

我认为正确的解决方案是将日志数据放入一个完全独立的类中,其目的只是存储和检索(以及截断、保存和...)日志信息。所有其他需要记录数据的窗口、类等都需要访问单个日志类指针。

logSystem->log("my friend is blue");

现在,在初始化期间 log​​System 是全局对象还是传递给每个类的对象取决于您。任何有许多“全球人是邪恶的”和“全球人是有帮助的”阵营的人来帮助你解决这个单独的问题。

然后,在您的日志记录窗口中,您只需要检索记录的数据并显示它。

 // Qt, C++-11 pseudo-api
foreach(String log, logMessages) {
    myListBox->append(log);
}

这种方法的另一个优点是您可以打开和关闭(创建和销毁)日志窗口,并且仍然不会丢失数据本身。是的,您也可以隐藏日志窗口或其他诡计,但能够完全销毁并重新创建它似乎更干净。更不用说,通过从日志窗口中分离出日志数据,您以后可以创建两个窗口,显示两组不同的日志数据。[假设您没有使用该全局记录数据,如上所述。]

于 2013-01-29T13:52:21.777 回答
1

我通常会将记录器编写为单例。

如果你想删除你的日志功能,很容易设置一个标志(用于运行时日志控制),或者用一个虚拟类替换它(用于编译时日志控制)。

所以在最基本的情况下,你可能有:

Log::Get().Error("Name truncated by %u bytes", nBytes );

是的,我喜欢可变参数 printf 风格的日志记录函数,但您可能更喜欢只有一个字符串或使用 C++ 流运算符。

如果我想拥有多个日志,我会将其设为可重用类并将其实例放入另一个单例(例如“应用程序”类)。在那种情况下,我可能有:

Log::EventsLog().Info("Something exciting happened" );
Log::SystemLog().Info("Shutting down" );

当可以(将)同时调用它们时,您通常需要对日志消息进行某种形式的互斥控制。如果您通过单线程队列(如在 Windows 消息传递中)将消息传递到日志窗口,则可能不需要这个。

于 2013-01-29T13:55:20.910 回答
0

我原以为应该将日志记录功能实现为独立的“单例”类...

于 2013-01-29T13:44:15.300 回答