我有一个派生的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_COPYrelated SO Question)。在这里推荐to make the member a pointer。那是最好的方法吗?

备注:


当我在派生的QMutex _mutex类中使用Q_OBJECT时,它可以正常工作。知道为什么我在这里而不是Q_OBJECT类出现错误吗?
在其他语言中,我会将该成员声明为临时成员。其实我不想复制它。是否有忽略的声明?
还是编写一个赋值/复制运算符是更好的方法?

最佳答案

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

在您的情况下,正确的答案是定义自己的复制和赋值运算符,以便他们复制/分配列表,但是对象具有它自己的互斥体。这样,它将表现出预期的效果。 C ++中没有关键字来告诉编译器您想要这种行为,您必须自己做。在这种情况下,由于它是互斥锁,您可能需要适当使用互斥锁以确保副本是原子的。

另一个选择是在新班级上禁用复制/作业,但是从您的问题来看,我认为这不是您想要做的。最后,如果您确实决定使用指向QMutex的指针,则可能要创建自己的复制/赋值运算符来正确处理原始指针,以防止泄漏。

07-28 02:02