【问题标题】:can you have a private member of the same class as the base class you're inheriting?您可以拥有与您继承的基类相同的类的私有成员吗?
【发布时间】:2009-10-21 08:17:16
【问题描述】:

我正在使用 Qt 库。我目前正在尝试创建自己的 QDockWidget(我的类正在继承)。现在我的班级有一个指向 QDockWidget 的指针。这甚至有意义吗?这是法律声明吗?有没有更好的方法将 QDockWidget 与我在 Qt 中的其他程序分开?我对如何实现新的 Dock Widget 有点迷茫。这是我的 QDockWidget 类的副本:

#ifndef DOC_MENU_WIDGET_H #define DOC_MENU_WIDGET_H #include "App_interface.h" #include <QObject> #include <QWidget> #include <QDockWidget> class Doc_menu_widget : public QWidget { //Q_OBJECT public: Doc_menu_widget(App_interface *parent); ~Doc_menu_widget(); private: QDockWidget *dock_widget; }; #endif

【问题讨论】:

  • 请注意,QDockWidget 和“指向QDockWidget 的指针”是两种完全不同的类型。
  • 为什么不直接从 QDockWidget 派生?你想表达什么:(a) Doc_menu_widget IS-A QDockWidget --> 派生 (b) IS-IMPLEMENTED_IN_TERMS-OF QDockWidget(与PERFORMS-LIKE QDockWidget相同) --> 使用私有成员

标签: c++ qt inheritance


【解决方案1】:

您似乎混淆了 IS-A 关系和 HAS-A 关系。

IS-A 关系通过继承实现。例如,QWidget IS-A QObject

HAS-A 关系由成员实现。例如,QWidget HAS-A 大小。

现在,您尝试开发的类与 QDockWidget 之间有什么关系?这将告诉您应该选择两者中的哪一个。

【讨论】:

  • 两者兼有有什么问题? “Dock Widget”是一个“Widget”,但同时拥有另一个“Widget”(可能是子小部件或不同的“Widget”)并没有错。
  • 在这种特殊情况下,QDockWidget 不可能有另一个 QDockWidget
  • has-a 可以通过私有继承来实现。尽管通常最好将其视为“根据以下方式实现”。
【解决方案2】:

你不应该这样做吗?

class Doc_menu_widget : public QDockWidget
{
    // ...
};

子类化QWidget 然后拥有一个私有的QDockWidget 属性当然是有意义的,但它可能不会帮助你实现“你自己的停靠小部件”(只要我理解正确)。您只能通过这种方式获取原始停靠小部件,并且可以将其放置在新小部件中的某个位置。

或者,如果您想从头开始实现 QDockWidget 的等价物,您可能不需要私有 QDockWidget

【讨论】:

    【解决方案3】:

    当然,为什么不呢。而且,如果您只是将 ptr 用于基类对象,则您没有任何 完全没有问题。

    您为什么不首先直接从 QDockWidget 派生?

    你想表达:

    • (a) Doc_menu_widget IS-A QDockWidget --> 派生

    • (b) IS-IMPLEMENTED_IN_TERMS-OF QDockWidget(与 PERFORMS-LIKE 相同) QDockWidget) --> 使用私有成员

    【讨论】:

      【解决方案4】:

      如果您只需要为您的QMainWindow 创建一个QDockWidget*,大多数情况下您可以简单地创建一个实例并立即使用它:

      QDockWidget* dock = new QDockWidget(this);
      dock->setWindowTitle("My Dock Widget");
      addDockWidget(Qt::LeftDockWidgetArea, dock, Qt::Vertical);
      

      如果您想创建具有不同行为或外观的自定义QDockWidget,那么从QDockWidget 继承可能更方便:

      #include <QDockWidget>
      
      class MyDockWidget : public QDockWidget
      {
      Q_OBJECT
          // ...
      };
      

      拥有一个带有QDockWidget* 私有成员的单独类当然是完全可能且合法的,但在这种情况下这不是最常见的选择。 原因是您很可能希望您的类是 QDockWidgetis-a 关系)的变体,这意味着它应该具有所有公共方法,并且它的实例应该能够传递给询问QDockWidget 实例的方法(例如,您希望能够添加一个到QMainWindow)。

      【讨论】:

        猜你喜欢
        • 2013-02-12
        • 2021-11-15
        • 2012-12-25
        • 1970-01-01
        • 2020-09-04
        • 2012-01-27
        • 2017-04-14
        • 1970-01-01
        • 2020-09-07
        相关资源
        最近更新 更多