0

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. それとも、代入/コピー演算子を書く方が良いですか?
4

2 に答える 2

2

QObject に問題がない理由は、QObject もコピーできないため、問題ではありません。

あなたの場合、正しい答えは、独自のコピーおよび割り当て演算子を定義して、リストをコピー/割り当てますが、オブジェクトには独自のミューテックスがあります。そうすれば、期待どおりに動作します。C++ には、この動作が必要であることをコンパイラに伝えるキーワードはありません。自分で行う必要があります。この場合、これはミューテックスであるため、ミューテックスを適切に使用して、コピーがアトミックであることを確認する必要があります。

別のオプションは、新しいクラスでのコピー/割り当てを無効にすることですが、あなたの質問から、それがあなたのやりたいことだとは思いません。最後に、QMutex へのポインターを使用することにした場合は、リークを防ぐために、生のポインターを適切に処理する独自のコピー/代入演算子を作成することをお勧めします。

于 2012-09-17T13:33:11.720 に答える
1

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

うまくいけば、これは役に立ちます。

于 2012-09-17T13:32:10.473 に答える