【发布时间】:2014-05-08 04:08:52
【问题描述】:
我需要创建一个继承自 QTextEdit 的对象。问题是每次我尝试从它继承时,都会出现以下错误:
错误 C2248:“QWidget::operator =”:无法访问类“QWidget”中声明的私有成员
我尝试定义operator=,但没有任何效果。即使我也定义了一个copy constructor。我总是不断收到这个错误。
【问题讨论】:
标签: c++ qt inheritance
我需要创建一个继承自 QTextEdit 的对象。问题是每次我尝试从它继承时,都会出现以下错误:
错误 C2248:“QWidget::operator =”:无法访问类“QWidget”中声明的私有成员
我尝试定义operator=,但没有任何效果。即使我也定义了一个copy constructor。我总是不断收到这个错误。
【问题讨论】:
标签: c++ qt inheritance
QWidget 类是 QObject 的子类,它使用 Q_DISABLE_COPY 保护宏禁用了复制和赋值操作。当您从QObject(或任何派生类)继承时,您定义的复制构造函数或赋值运算符会尝试访问基类的对应部分,但它们在QObject 中是私有的,无法访问。这是设计使然。
作为副作用,从QObject 继承的类的对象不能存储在 STL 或 Qt 容器(向量、列表等)中。只能存储指针或引用。因为获取/设置对象需要使用复制构造函数进行复制,这是不可能的。
如果您既需要继承QWidget 又需要重载operator= 和/或copy constructor,您可以通过为这些任务添加显式方法来实现,例如isEqual 或clone(尽管克隆QObject 是不是good idea)。
【讨论】:
QObject 的子类,这是不正确的。并非所有 Qt 类都是 QObject 的子类。
QObject 的子类。您是否坚持认为,例如 Qt 类 QPixmap 是 QObject 的子类?
Qt object 与object 的含义不同,object 是一个类的实例。不过,他们使用的术语有点误导。