У меня есть производное 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
, связанный вопрос SO). Здесь рекомендуется сделать член указателем. Это лучший способ сделать это?
Примечания:
QMutex _mutex
в производном Q_OBJECT
класс, работает нормально. Любая идея, почему я получаю ошибку здесь, а не с Q_OBJECT
учебный класс?Причина, по которой у него нет проблем с QObject, заключается в том, что QObject также не подлежит копированию, поэтому это не проблема.
В вашем случае правильный ответ — определить свои собственные операторы копирования и присваивания, чтобы они копировали / присваивали список, но у объекта был свой собственный мьютекс. Таким образом, он будет вести себя так, как вы ожидаете. В C ++ нет ключевого слова, которое сообщало бы компилятору о том, что вам нужно, но вы должны сделать это самостоятельно. В этом случае, поскольку это мьютекс, вы, вероятно, захотите правильно использовать мьютекс, чтобы убедиться, что копия является атомарной.
Другой вариант — отключить копирование / назначение в вашем новом классе, но из вашего вопроса я не верю, что это то, что вы хотите сделать. Наконец, если вы решите использовать указатель на QMutex, вы, вероятно, захотите создать свои собственные операторы копирования / назначения для правильной обработки необработанного указателя, чтобы предотвратить утечку.
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 */
..
};
Надеюсь, это поможет.