课堂上的文件声明应该是静态的吗?

时间:2012-11-02 07:09:01

标签: c++ qt class file-io static

我有一个简单的类,bean创建了allot,在这个类中我写了一个中心文件 我用互斥锁保护文件,同时很少有类实例可以在同一时间进行写操作 我没有将文件引用作为参数传递给类 如果我在类中创建文件作为静态成员,那么它将被创建一次 好点吗 ? 这就是我现在所拥有的:

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;

或静态

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;

3 个答案:

答案 0 :(得分:1)

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

  1. 在构建甚至第一个 CollectWorker对象之外对其进行初始化。类静态Init()成员(和匹配的Close())可以做到这一点。
  2. 如果是单线程,您可以通过检查文件指针来查看它是否已经创建并打开,并在构造函数中创建它,并且只有在不创建和打开时才这样做
  3. 如果是多线程的,你需要一个可以在构造函数输入上锁存的类级互斥锁,检查指针,只有在它为NULL时才创建它,然后解锁互斥锁。
  4. 我觉得奇怪的是你使用相同的文件 object 来引用多个CollectWorker实例引用同一个文件,每个实例都可能期望文件指针处于不同的状态,我认为这个只是要求麻烦..如果这是只读的,你最好让每个CollectWorker只用自己的QFile指针打开同一个文件(非静态),保证它们都有自己的指针,更重要的是,在运行时文件中的读取偏移量。

答案 1 :(得分:0)

当一个类的所有成员都是静态的时,你就失去了主要的OOP想法。

您可以使用标题中定义的某些函数替换该类。

作为表演,我认为你不会注意到差异。

答案 2 :(得分:0)

这很好,甚至在你的情况下更喜欢。描述的情况中的文件是一个共享资源,应该被视为一个(这正是类static在类范围内的意义)。拥有同一资源的多个句柄只会使代码混淆和复杂化。

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