![](/img/trans.png)
[英]Find root cause of “cannot access private member declared in class 'QObject'”
[英]'QObject::QObject' cannot access private member declared in class 'QObject'
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'中聲明的私有成員”錯誤?
我猜你的CHIProjectData
類正在某處復制(使用編譯器生成的復制構造函數或賦值運算符)。 無法復制或分配QObject
,因此會導致錯誤。 但是,編譯器沒有指向錯誤的行,因此它在文件中選擇了一些行(最后一個大括號是常見的,因為在解析類聲明之后編譯器知道它是否應該生成這些函數看他們是否已經存在)。
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){
}
將復制構造函數添加到CHIProjectData類就可以了。
使用QObject
子類對象嘗試使用指針進行操作。
采取有問題的方案
myObject = MyObjectClass()
在這種情況下,它更干凈
MyObjectClass *myObject;
//code
myObject = new MyObjectClass;
這將通過使用引用復制和分配來消除對象復制和分配的需要。
在我的例子中,問題是Q_OBJECT
宏默默地引入了private:
說明符,即使在結構中也是如此:
struct myClass : public QObject {
Q_OBJECT
// everything here is private now...
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.