Qt: член QMutex в производном QList & lt; XYZ & gt ;, нет доступа к ошибке компиляции члена QMutex

У меня есть производное 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). Здесь рекомендуется сделать член указателем. Это лучший способ сделать это?

Примечания:

  1. Когда я использую QMutex _mutex в производном Q_OBJECT класс, работает нормально. Любая идея, почему я получаю ошибку здесь, а не с Q_OBJECT учебный класс?
  2. На других языках я бы объявил член как переходный. На самом деле я делаю не хочу, чтобы это было скопировано. Есть ли декларация, чтобы просто игнорировать это?
  3. Или лучше написать оператор присваивания / копирования?

0

Решение

Причина, по которой у него нет проблем с QObject, заключается в том, что QObject также не подлежит копированию, поэтому это не проблема.

В вашем случае правильный ответ — определить свои собственные операторы копирования и присваивания, чтобы они копировали / присваивали список, но у объекта был свой собственный мьютекс. Таким образом, он будет вести себя так, как вы ожидаете. В C ++ нет ключевого слова, которое сообщало бы компилятору о том, что вам нужно, но вы должны сделать это самостоятельно. В этом случае, поскольку это мьютекс, вы, вероятно, захотите правильно использовать мьютекс, чтобы убедиться, что копия является атомарной.

Другой вариант — отключить копирование / назначение в вашем новом классе, но из вашего вопроса я не верю, что это то, что вы хотите сделать. Наконец, если вы решите использовать указатель на QMutex, вы, вероятно, захотите создать свои собственные операторы копирования / назначения для правильной обработки необработанного указателя, чтобы предотвратить утечку.

2

Другие решения

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 */
..
};

Надеюсь, это поможет.

1

По вопросам рекламы [email protected]