用指向对象的指针初始化不可复制的第三方基类

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。

然后你把你的初始化代码放在派生的小部件中。

【讨论】:

以上是关于用指向对象的指针初始化不可复制的第三方基类的主要内容,如果未能解决你的问题,请参考以下文章

类型兼容---子类的对象可以给父类指针赋值

初始化指向多维数组的动态指针的正确方法? [复制]

如何复制 C++ 指针数据? [复制]

关于C++基类、派生类的引用和指针

指针(pointer)总结

"指针"和"引用"大对比