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

Sul*_*lla 22 c++ inheritance qt 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;
}
Run Code Online (Sandbox Code Playgroud)

为什么它会让"'QObject :: QObject'无法访问类'QObject'中声明的私有成员"错误?

Cal*_*itt 28

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

  • 谢谢,这正是我的问题,虽然复制QObject的行是在另一个代码文件中.(它也隐藏在`myObject = MyObjectClass()`中.) (3认同)

Igo*_*aka 13

默认构造函数QObject必须是私有的,并且您获得的错误很可能与CHIProjectData::CHIProjectData(默认构造函数)隐式尝试调用基类的默认构造函数有关.如果你看一下QObject你很可能会发现它的定义是这样的:

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

解决方案是使默认QObject构造函数受保护或公共或从默认CHIProjectData构造函数调用其他构造函数重载:

CHIProjectData::CHIProjectData() : QObject(NULL){
}
Run Code Online (Sandbox Code Playgroud)


Sul*_*lla 4

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

  • 请注意,您并没有真正复制整个 CHIProjectData,除非您在复制构造函数中执行更多工作,将设置从原始实例的 QObject 父级复制到新实例的 QObject 父级。这包括信号和槽连接等。 (4认同)