2010-08-17 108 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... 
}