0

我有一个派生QList<MyClass>,有一个成员QMutex

class WaypointList : public QList<Waypoint> {
private:
    mutable QMutex _mutex; /*!< Mutex for thread safety */
    ..
} // HERE COMPILE ERROR, in this line

编译,我得到C2248: 'QMutex::operator =' : cannot access private member declared in class 'QMutex'

原因是QMutex不可复制(Q_DISABLE_COPY相关的SO Question)。这里建议将成员设为指针这是最好的方法吗?

评论:

  1. 当我QMutex _mutex在派生Q_OBJECT类中使用时,它工作正常。知道为什么我在这里得到错误而不是在Q_OBJECT课堂上吗?
  2. 在其他语言中,我将成员声明为瞬态。其实我不想复制它。是否有忽略它的声明?
  3. 还是编写赋值/复制运算符是更好的方法?
4

2 回答 2

2

QObject 没有问题的原因是 QObject 也是不可复制的,所以这不是问题。

在您的情况下,正确的答案是定义您自己的复制和赋值运算符,以便它们复制/分配列表,但对象有它自己的互斥锁。这样,它的行为就会如您所愿。C++ 中没有关键字告诉编译器你想要这种行为,你必须自己做。在这种情况下,由于它是互斥体,您可能希望正确使用互斥体以确保副本是原子的。

另一种选择是禁用新课程的复制/分配,但从你的问题来看,我不相信这是你想要做的。最后,如果您决定使用指向 QMutex 的指针,您可能需要创建自己的复制/赋值运算符来正确处理原始指针,以防止泄漏。

于 2012-09-17T13:33:11.720 回答
1

Q_OBJECT是一个必须出现在类定义的私有部分中的宏,它声明它自己的信号和槽,或者使用 Qt 的元对象系统(这里)提供的其他服务。此宏要求该类是QObject. QObject既没有复制构造函数也没有赋值运算符(看看这里)。

对不起,如果我重复你知道的事情。我建议使用Q_DISABLE_COPY宏显式禁用类的复制构造函数和赋值运算符:

class WaypointList : public QList<Waypoint> {
private:
    Q_DISABLE_COPY(WaypointList)
    mutable QMutex _mutex; /*!< Mutex for thread safety */
    ..
};

希望,这会有所帮助。

于 2012-09-17T13:32:10.473 回答