我有一个派生的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,与此相关的问题)。这里推荐使用使成员成为指针。是最好的方法吗?
备注:
QMutex _mutex类中使用Q_OBJECT时,它工作得很好。知道我为什么在这里得到错误,而不是使用Q_OBJECT类吗?发布于 2012-09-17 13:33:11
QObject没有问题的原因是QObject也是不可复制的,所以它不是一个问题。
在您的例子中,正确的答案是定义您自己的复制和赋值操作符,以便他们复制/分配列表,但是对象有它自己的互斥体。那样的话,它就会像你期望的那样。在C++中没有关键字可以告诉编译器你想要这种行为,你必须自己去做。在本例中,由于它是互斥体,您可能希望正确地使用互斥锁,以确保副本是原子的。
另一种选择是禁用新课上的复制/赋值,但从您的问题中我不认为这是您想要做的。最后,如果您确实决定使用指向QMutex的指针,您可能希望创建自己的复制/赋值操作符来正确处理原始指针,以防止泄漏。
发布于 2012-09-17 13:32:10
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 */
..
};希望这个会有帮助的。
https://stackoverflow.com/questions/12459470
复制相似问题