首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Qt:派生QMutex中的QList<XYZ>成员,不能访问QMutex成员编译错误

Qt:派生QMutex中的QList<XYZ>成员,不能访问QMutex成员编译错误
EN

Stack Overflow用户
提问于 2012-09-17 12:45:08
回答 2查看 1.1K关注 0票数 0

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

代码语言:javascript
复制
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与此相关的问题)。这里推荐使用使成员成为指针是最好的方法吗?

备注:

  1. 当我在派生的QMutex _mutex类中使用Q_OBJECT时,它工作得很好。知道我为什么在这里得到错误,而不是使用Q_OBJECT类吗?
  2. 在其他语言中,我会宣布该成员为临时成员。实际上,我做的是,而不是,我想要复制它。是否有一个声明只是忽略它?
  3. 还是写作业/复制操作符是更好的方法?
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-09-17 13:33:11

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

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

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

票数 2
EN

Stack Overflow用户

发布于 2012-09-17 13:32:10

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

抱歉,我重复一遍你知道的事。我建议使用Q_DISABLE_COPY宏显式禁用类的复制构造函数和赋值操作符:

代码语言:javascript
复制
class WaypointList : public QList<Waypoint> {
private:
    Q_DISABLE_COPY(WaypointList)
    mutable QMutex _mutex; /*!< Mutex for thread safety */
    ..
};

希望这个会有帮助的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12459470

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档