【问题标题】:'QObject::QObject' cannot access private member declared in class 'QObject'“QObject::QObject”无法访问在“QObject”类中声明的私有成员
【发布时间】:2011-03-31 06:26:51
【问题描述】:
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' cannot access private member declaration in class 'QObject'”的错误?

【问题讨论】:

  • 是什么导致了错误?哪条线路触发它?
  • 为什么不使用初始化列表来初始化所有成员呢?
  • @Charles:错误指向CHIProjectData类声明的最后一行。
  • @Charles:添加 QObject 作为基类会触发错误。早些时候没有基类的程序运行良好
  • @Arun:这似乎不对。仅当某些原因导致使用默认构造函数时才应触发该错误。你的默认构造函数定义在哪里?

标签: c++ qt inheritance qt4


【解决方案1】:

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

【讨论】:

  • 谢谢,这正是我的问题,尽管复制 QObject 的行在另一个代码文件中。 (它也隐藏在myObject = MyObjectClass() 中。)
【解决方案2】:

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

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

解决方案是将默认的QObject构造函数设为protected或public,或者从默认的CHIProjectData构造函数调用其他构造函数重载:

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

【讨论】:

  • 或者让aProjectData默认为QMap&lt;QString,QString&gt;(),这样你就可以免费得到一个默认的构造函数了。
  • 理论不错,但QObject 的唯一构造函数是公共的,QObject(QObject* parent=0)。并且改变 Qt 的 API 并不是一个真正的选择。
【解决方案3】:

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

【讨论】:

  • 请注意,您并没有真正复制整个 CHIProjectData,除非您在复制构造函数中做更多工作以将设置从原始实例的 QObject 父级复制到新实例的 QObject 父级.这包括信号和插槽连接之类的东西。
【解决方案4】:

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

采取有问题的场景

myObject = MyObjectClass() 

在这种情况下它更干净

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

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

【讨论】:

    【解决方案5】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-05-20
      • 1970-01-01
      • 1970-01-01
      • 2010-12-19
      • 1970-01-01
      • 1970-01-01
      • 2013-02-13
      相关资源
      最近更新 更多