'QObject :: QObject'无法访问类'QObject'中声明的私有成员

时间:2010-08-17 22:36:24

标签: c++ qt inheritance qt4

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'类中声明的私有成员”错误?

5 个答案:

答案 0 :(得分:28)

我猜你的CHIProjectData类正在某处复制(使用编译器生成的复制构造函数或赋值运算符)。无法复制或分配QObject,因此会导致错误。但是,编译器没有指向错误的行,因此它在文件中选择了一些行(最后一个大括号是常见的,因为在解析类声明之后编译器知道它是否应该生成这些函数看他们是否已经存在。)

答案 1 :(得分: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){
}

答案 2 :(得分:4)

将复制构造函数添加到CHIProjectData类就可以了。

答案 3 :(得分:3)

使用QObject子类对象时,尝试使用指针进行操作。

采取有问题的方案

myObject = MyObjectClass() 

在这种情况下,它更干净

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

这将通过使用参考复制和分配来消除对象复制和分配的需要。

答案 4 :(得分:1)

就我而言,问题是Q_OBJECT宏默默地引入了private:说明符,即使在结构中也是如此:

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