C++ Qt:QMutex成员在派生的QList中<;XYZ>;,无法访问QMutex成员编译错误

C++ Qt:QMutex成员在派生的QList中<;XYZ>;,无法访问QMutex成员编译错误,c++,qt4,C++,Qt4,我有一个派生的QList,其中有一个成员QMutex class WaypointList : public QList<Waypoint> { private: mutable QMutex _mutex; /*!< Mutex for thread safety */ .. } // HERE COMPILE ERROR, in this line 类航路点列表:公共QList{ 私人: 可变QMutex\u互斥体;/*!

我有一个派生的
QList
,其中有一个成员
QMutex

class WaypointList : public QList<Waypoint> {
private:
    mutable QMutex _mutex; /*!< Mutex for thread safety */
    ..
} // HERE COMPILE ERROR, in this line
类航路点列表:公共QList{
私人:
可变QMutex\u互斥体;/*!<用于线程安全的互斥体*/
..
}//此处编译错误,在此行中
编译时,我得到
C2248:'QMutex::operator=':无法访问在类'QMutex'中声明的私有成员。

原因是
QMutex
不可复制(
Q\u DISABLE\u COPY
,)。这里是推荐的这是最好的方法吗?

备注:

  • 当我在派生的
    Q\u对象
    类中使用
    QMutex\u互斥时,它工作得很好。知道为什么我在这里得到错误而不是使用
    Q\u对象
    类吗
  • 在其他语言中,我将声明该成员为临时成员。事实上,我确实不想拷贝它。是否有一个声明可以忽略它
  • 还是编写赋值/复制运算符是更好的方法

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

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

    class WaypointList : public QList<Waypoint> {
    private:
        Q_DISABLE_COPY(WaypointList)
        mutable QMutex _mutex; /*!< Mutex for thread safety */
        ..
    };
    
    类航路点列表:公共QList{
    私人:
    Q_禁用_复制(航路点列表)
    可变QMutex\u互斥体;/*!<用于线程安全的互斥体*/
    ..
    };
    

    希望,这会有所帮助。

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

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

    class WaypointList : public QList<Waypoint> {
    private:
        Q_DISABLE_COPY(WaypointList)
        mutable QMutex _mutex; /*!< Mutex for thread safety */
        ..
    };
    
    类航路点列表:公共QList{
    私人:
    Q_禁用_复制(航路点列表)
    可变QMutex\u互斥体;/*!<用于线程安全的互斥体*/
    ..
    };
    

    希望,这会有所帮助。

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

    在您的情况下,正确的答案是定义您自己的复制和赋值操作符,以便它们复制/赋值列表,但对象有自己的互斥体。这样,它将按照您的预期运行。C++中没有关键字告诉编译器你想要这个行为,你必须自己去做。在这种情况下,由于它是一个互斥体,您可能希望正确使用互斥体以确保副本是原子的


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

    它与QObject没有问题的原因是QObject也是不可复制的,因此它不是问题

    在您的情况下,正确的答案是定义您自己的复制和赋值操作符,以便它们复制/赋值列表,但对象有自己的互斥体。这样,它将按照您的预期运行。C++中没有关键字告诉编译器你想要这个行为,你必须自己去做。在这种情况下,由于它是一个互斥体,您可能希望正确使用互斥体以确保副本是原子的


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

    如果您做得对,我更希望保留“复制”,并在从不同线程复制和分配期间需要互斥。我用自己的操作符对它进行了一次尝试(然后我会回来:-)你说得对,我更喜欢保留“copy”,并且在复制和分配不同线程时需要互斥。我用自己的操作符对它进行了一次尝试(然后我会回来:-),这同样有效,但我坚持使用我可以复制的类的一个版本(=>实现的赋值操作符)。谢谢你的提示。这同样有效,但我坚持使用我可以复制的类的版本(=>已实现的赋值运算符)。谢谢你的提示。