2010-08-17 42 views
22
class CHIProjectData : public QObject 
{ 
public: 
    CHIProjectData(); 
    CHIProjectData(QMap<QString,QString> aProjectData, 
        CHIAkmMetaData* apAkmMetaData = 0, 
        QObject* parent = 0); 
private: 
    QMap <QString,QString> m_strProjectData; 
    CHIAkmMetaData* m_pAkmMetaData; 
}; 

CHIProjectData::CHIProjectData(QMap<QString,QString> aProjectData, 
           CHIAkmMetaData* apAkmMetaData, 
           QObject* aParent) 
    : 
    QObject(aParent) 
{ 
     m_strProjectData = aProjectData; 
     m_pAkmMetaData = apAkmMetaData; 
} 

爲什麼它帶來的「‘的QObject :: QObject的’不能訪問類的QObject的「聲明爲private成員」錯誤?「的QObject :: QObject的」不能訪問類中聲明私有成員「的QObject」

+2

是什麼原因造成的錯誤?什麼線觸發它? – 2010-08-17 22:41:31

+0

爲什麼不使用初始化器列表初始化所有成員? – GManNickG 2010-08-17 22:50:53

+0

@Charles:錯誤指向CHIProjectData類聲明的最後一行。 – Sulla 2010-08-17 22:55:47

回答

4

向CHIProjectData類中添加一個拷貝構造函數有竅門。

+4

請注意,你並不是真的在拷貝整個CHIProjectData,除非你在拷貝構造函數中做了更多的工作來複制設置原始實例的QObject父項添加到新實例的QObject父項。這包括信號和插槽連接等內容。 – 2010-08-20 14:26:18

13

QObject的默認構造函數必須是私有的,並且您得到的錯誤很可能會與隱含地嘗試調用基類的默認構造函數的CHIProjectData::CHIProjectData(默認構造函數)有關。如果你看一下QObject,你很可能會發現,它的定義是這樣的:

class QObject { 
    QObject(); //private contructor, derived classes cannot call this constructor 
public: 
    QObject(QObject* aParent); 
}; 

的解決方案是使默認QObject構造保護或公開,或從默認CHIProjectData構造函數中調用其他構造函數重載:

CHIProjectData::CHIProjectData() : QObject(NULL){ 
} 
+0

或者'aProjectData'默認爲'QMap ()',所以你得到一個免費的默認構造函數。 – GManNickG 2010-08-17 22:52:03

+1

好理論,但'QObject'唯一的構造函數是public,'QObject(QObject * parent = 0)'。而改變Qt的API並不是真正的選擇。 – 2010-08-17 23:57:32

26

我猜你的CHIProjectData類正在複製某處(使用編譯器生成的複製構造函數或賦值運算符)。 QObject不能複製或分配給,所以會導致錯誤。然而,編譯器沒有指向錯誤的路線,所以它在文件中選擇了一些行(最後的大括號是常見的,因爲在解析類聲明後,編譯器知道它是否應該生成這些函數看看他們是否已經存在)。

+2

謝謝,這正是我的問題,雖然複製QObject的行在另一個代碼文件中。 (它也隱藏在一個'myObject = MyObjectClass()'中)。 – 2012-06-28 09:56:27

3

當使用QObject子類對象時,嘗試使用指針進行操作。

拿有問題的情況下

myObject = MyObjectClass() 

在這種情況下,它更乾淨有

MyObjectClass *myObject; 
//code 
myObject = new MyObjectClass; 

這將通過參考複製和作業刪除對對象的複製和任務的需要。

1

在我的情況下,問題是,Q_OBJECT宏默默引入了private:符,即使是在一個結構:

struct myClass : public QObject { 
    Q_OBJECT 
    // everything here is private now... 
}