2012-09-17 139 views
0

我有派生QList<MyClass>,成員QMutexQt:派生QList中的QMutex成員<XYZ>,無法訪問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_COPYrelated SO Question)。這裏建議使用to make the member a pointer這是最好的辦法嗎?

備註:

  1. 當我在派生類Q_OBJECT使用QMutex _mutex,它工作正常。任何想法,爲什麼我在這裏得到錯誤,而不是與Q_OBJECT類?
  2. 在其他語言中,我會將該成員聲明爲transient。其實我不是想要複製它。有沒有聲明只是忽略它?
  3. 或者正在寫作業/複製操作員更好的方法?

回答

2

它與QObject沒有問題的原因是QObject也是不可複製的,所以它不是問題。

在你的情況下,正確的答案是定義你自己的複製和賦值操作符,以便它們複製/分配列表,但對象具有它自己的互斥量。這樣,它就會像你期望的那樣行事。在C++中沒有關鍵字來告訴編譯器你想要這種行爲,你必須自己做。在這種情況下,因爲它是一個互斥體,所以您可能需要正確使用互斥體以確保副本是原子的。

另一種方法是禁用複製/分配您的新課程,但從您的問題我不相信這是你想要做的。最後,如果您決定使用指向QMutex的指針,您可能需要創建自己的複製/賦值運算符來正確處理原始指針,以防止泄漏。

+0

你說得對,我寧願保留「複製」,並在複製和分配不同線程時需要互斥體。我用自己的操作員給它試用(然後我會回來:-) –

+0

就是這樣,歡呼聲。 –

1

Q_OBJECT是必須出現在類的定義,聲明自己的信號和槽的私人部分或使用通過Qt的元對象系統(here)提供的其他服務的宏。這個宏需要該類是QObject的一個子類。 QObject既沒有拷貝構造函數也沒有賦值操作符(take a look here)。

對不起,如果我重複你知道的東西。我會建議明確禁止拷貝構造函數和類的賦值操作符與Q_DISABLE_COPY宏:

class WaypointList : public QList<Waypoint> { 
private: 
    Q_DISABLE_COPY(WaypointList) 
    mutable QMutex _mutex; /*!< Mutex for thread safety */ 
    .. 
}; 

希望,這將有助於。

+0

這也適用,但我堅持我可以複製的類的版本(=>賦值運算符實現)。謝謝你的提示。 –