用指向对象的指针初始化不可复制的第三方基类
Posted
技术标签:
【中文标题】用指向对象的指针初始化不可复制的第三方基类【英文标题】:Initialize uncopyable third-party base class, with pointer to object 【发布时间】:2013-10-11 19:51:02 【问题描述】:我正在与 Qt 战斗。无法为我的具体问题找到可靠的解决方案。
我们有自定义 class MyWidget
必须:
QWidget
以覆盖closeEvent
方法
具有必须在构造函数中初始化的字段
问题:
QWidget
的内脏使用来自 .ui
文件的 QUiLoader
初始化。所以我只有QWidget*
指针
QWidget
不可复制。
QWidget
没有移动构造函数
代码(为简单起见省略了错误检查和内存管理):
class MyWidget : public QWidget
bool m_Closed;
public:
MyWidget(QWidget* qw) :
QWidget(*qw), // error: copy constructor is private
m_Closed(false)
bool IsClosed() const return m_Closed;
virtual void closeEvent(QCloseEvent *) override m_Closed = true;
;
QFile file("main.ui");
QUiLoader uiLoader;
MyWidget* uiMain = new MyWidget(uiLoader.load(&file));
uiMain->show();
问题:
如何解决这个问题?我觉得解决方法很简单。 我可以在这里使用移动语义吗?注意:
我无法创建QWidget
成员,因为我需要重写它的方法。
可能,我可以创建一些MyWidget::Init()
方法来初始化那些bool
标志,必须在每次实例化后调用。但我觉得这个解决方案不可靠。
最后,我必须只有QWidget
,我可以检查它是否已关闭(也许你知道另一种简单的方法)
我使用 MSVC 2013 RC 和 GCC 4.8.1,所以 C++11 解决方案会很棒
不要犹豫,我感谢任何建议和批评。
【问题讨论】:
【参考方案1】:.ui
文件可以使用派生自 QWidget
的自定义类,因此您可以在 Designer 中使用您的类 - 即使不编写任何 Designer 插件(不会显示)。右键单击小部件并选择“推广”。
您需要创建自己的QUiLoader
派生版本,并提供可以创建小部件的工厂方法QUiLoader::createWidget
的实现。有关完整示例,请参阅 this answer。
然后你把你的初始化代码放在派生的小部件中。
【讨论】:
以上是关于用指向对象的指针初始化不可复制的第三方基类的主要内容,如果未能解决你的问题,请参考以下文章