我有一个派生的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
,related SO Question)。在这里推荐to make the member a pointer。那是最好的方法吗?备注:
当我在派生的
QMutex _mutex
类中使用Q_OBJECT
时,它可以正常工作。知道为什么我在这里而不是Q_OBJECT
类出现错误吗?在其他语言中,我会将该成员声明为临时成员。其实我不想复制它。是否有忽略的声明?
还是编写一个赋值/复制运算符是更好的方法?
最佳答案
QObject没问题的原因是QObject也是不可复制的,因此这不是问题。
在您的情况下,正确的答案是定义自己的复制和赋值运算符,以便他们复制/分配列表,但是对象具有它自己的互斥体。这样,它将表现出预期的效果。 C ++中没有关键字来告诉编译器您想要这种行为,您必须自己做。在这种情况下,由于它是互斥锁,您可能需要适当使用互斥锁以确保副本是原子的。
另一个选择是在新班级上禁用复制/作业,但是从您的问题来看,我认为这不是您想要做的。最后,如果您确实决定使用指向QMutex的指针,则可能要创建自己的复制/赋值运算符来正确处理原始指针,以防止泄漏。