应该在类中的文件声明为静态
Should file declaration in class be static?
我有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;
如果您需要所有收集器对象访问的类(或全局)文件指针,
- 在 first collectworker对象的构造之外初始化它。类静态init()成员(和匹配的关闭())将执行此操作。
- 如果单线读取,您可以通过检查文件指针来查看是否已经创建和打开它来要求在构造函数中创建它,并且只有在没有的情况下,请这样做
- 如果多线程,您需要一个可以在构造函数上锁定的类级互斥品,请检查指针,并且仅在null时创建它,然后inlunt the Mutex。 。
我认为您使用的是相同的文件对象通过多个收集工作者实例引用相同的文件,每个文件都可能期望在另一个状态下文件指针,我认为这是即将要解决问题。如果仅阅读,您会是 far 最好让每个收集工作者都用自己的qfile指针(非静态)打开同一文件,保证他们都得到自己的指针,更重要的是,在运行时,文件中的读书事件。
当班级的所有成员都是静态的,您将失去主要的OOP想法。
您可以用标题中定义的一些功能替换课程。
作为性能,我认为您不会注意到差异。
很好,甚至在您的情况下更喜欢。所述情况下的文件是共享资源,应被视为一个(这正是static
在类范围中的内容)。对同一资源有多个处理只会使代码混淆并复杂化。
但是请注意,这在某种程度上限制了代码的灵活性 - 例如,如果您需要从类的不同实例访问不同的文件。
由于您使用的QT,您只需使用连接类型Qt::QueuedConnection
的信号和插槽即可。这样,您可以创建一个单个输出类,并使用QObject::connect
将各种工人连接到它。您将可以消除Mutex锁定,因为QT事件循环为您处理所有这些。当然,这假设您的工作人员线程正在运行自己的QT事件循环(QT libs的最新版本中的默认值)。
相关文章:
- .cpp和.h文件中的模板专用化声明
- 在 .h 文件中的类中声明静态变量和在.cpp文件中声明"global"变量有什么区别
- 用"=default"声明的函数应该只在头文件中执行
- 调用在 HXX 文件中声明的静态数据成员
- 如何在 c++ 的不同文件中声明类?
- 如何在头文件中声明类模板(由于循环依赖关系)
- 声明要在 qml 和 cpp 文件中使用的全局字符串
- 在.cpp文件之间传递结构声明,而不使用全局头文件
- 为什么要将函数声明和定义放在单独的文件中
- 枚举前向声明与头文件
- 在命名空间中声明变量,在 main 中定义它,使其对所有其他文件可见
- 在带有类型保护的模板文件中使用前向声明
- 在指向现有内存地址的 hpp 文件中声明成员函数的最佳方法
- 在多个头文件中从接口声明被覆盖的函数时,如何避免重复代码?
- 应该在类中的文件声明为静态
- 是否应从头文件声明中排除辅助函数?(C++)
- 哪个C++头文件声明 strlen
- 如何为头文件声明“#include”以避免“error lnk2005”
- 打开文件和关闭文件声明定位:最佳做法,优点,缺点
- 说双向文件声明不隐式设置标志是否正确