应该在类中的文件声明为静态

Should file declaration in class be static?

本文关键字:文件 声明 静态      更新时间:2023-10-16

我有bean创建的简单类,在此类中,我写入一个中心文件我用静音的文件保护文件,beacose很少可以同时进行写操作。
我不会将文件参考作为参数传递到类。
如果我将文件作为静态成员创建,该文件将被创建一次。
好点吗 ?这就是我现在拥有的:

CollectorWorker::CollectorWorker()
{
   m_pFileOutput = new QFile("my_result.txt");
   if (!m_pFileOutput->open(QIODevice::WriteOnly
                          | QIODevice::Text | QIODevice::Append))
   {
     LOG_MSG("my_result.txt can't be open")
   } 
}
//header
QFile* m_pFileOutput;

或static

QFile* CollectorWorker::m_pFileOutput = new QFile("my_result.txt");
CollectorWorker::CollectorWorker()
{
  if (!m_pFileOutput->open(QIODevice::WriteOnly
                         | QIODevice::Text | QIODevice::Append))
  {
    LOG_MSG("my_result.txt can't be open")
  } 
}
//header
static QFile* m_pFileOutput;

如果您需要所有收集器对象访问的类(或全局)文件指针,

  1. first collectworker对象的构造之外初始化它。类静态init()成员(和匹配的关闭())将执行此操作。
  2. 如果单线读取,您可以通过检查文件指针来查看是否已经创建和打开它来要求在构造函数中创建它,并且只有在没有的情况下,请这样做
  3. 如果多线程,您需要一个可以在构造函数上锁定的类级互斥品,请检查指针,并且仅在null时创建它,然后inlunt the Mutex。

我认为您使用的是相同的文件对象通过多个收集工作者实例引用相同的文件,每个文件都可能期望在另一个状态下文件指针,我认为这是即将要解决问题。如果仅阅读,您会是 far 最好让每个收集工作者都用自己的qfile指针(非静态)打开同一文件,保证他们都得到自己的指针,更重要的是,在运行时,文件中的读书事件。

当班级的所有成员都是静态的,您将失去主要的OOP想法。

您可以用标题中定义的一些功能替换课程。

作为性能,我认为您不会注意到差异。

很好,甚至在您的情况下更喜欢。所述情况下的文件是共享资源,应被视为一个(这正是static在类范围中的内容)。对同一资源有多个处理只会使代码混淆并复杂化。

但是请注意,这在某种程度上限制了代码的灵活性 - 例如,如果您需要从类的不同实例访问不同的文件。

由于您使用的QT,您只需使用连接类型Qt::QueuedConnection的信号和插槽即可。这样,您可以创建一个单个输出类,并使用QObject::connect将各种工人连接到它。您将可以消除Mutex锁定,因为QT事件循环为您处理所有这些。当然,这假设您的工作人员线程正在运行自己的QT事件循环(QT libs的最新版本中的默认值)。