【问题标题】:C++ / QT Inheritance Program Architecture [closed]C ++ / QT继承程序架构[关闭]
【发布时间】:2021-02-07 13:28:40
【问题描述】:

我有几个类,继承自一个基类。我想为所有子类添加一些功能,确切地说是一个计时器,以及处理它的函数,除了一个。因此,我不能只将此代码添加到父类。处理此任务的最佳方法是什么,避免代码复制?谢谢!

【问题讨论】:

    标签: c++ qt inheritance


    【解决方案1】:

    您可以使用 mixin,创建一个带有计时器的类,以及其他想要使用它的类从它继承。如果可能,此类不应继承任何形式。

    编辑以添加示例:

    你创建了一个没有从QObject继承的类:

    class TimerMixIn {}
    

    让任何需要使用TimerMixIn的类都继承自它:

    class A : public QObject, public TimerMixIn {}
    class B : public QWidget, public TimerMixIn {}
    

    【讨论】:

    • 这是公认的答案。至少可以说是不清楚和不完整的。
    • @scopchanov 我想说的是,它和问题一样清晰和完整:)
    • @cigien,这是真的。不过,我们欢迎您付出更多努力。
    • @scopchanov 同意。很难看到如何用问题中的信息更好地回答这个问题。可能最好不要一开始就回答它:)
    • @cigien,确实如此。
    【解决方案2】:

    如果您确定这些类最好以层次结构的形式表示,那么您可以执行以下操作之一:

    QTimer 嵌入到基类中:

    class BaseWithTimer : public QObject
    {
        Q_OBJECT
    
    protected:
        QTimer m_timer;
    };
    

    除了继承QObject之外别无他法:

    class AnyClassWhereTimerNeeded : public QObject // no need more than just QObject
    {
        Q_OBJECT
    
    public:
        AnyClassWhereTimerNeeded()
        {
            // To stop the timer you have to save the id it returns
            startTimer(1000);        
    
            // But you can start many timers without creation any new objects
            startTimer(50);
            startTimer(1000);
            startTimer(60000);
        }
    
    protected:
        void timerEvent(QTimerEvent* event) override 
        {
            // do what you need
        }
    };
    

    如您所见,第一种方法基于信号和插槽,而第二种方法基于事件。至于我,嵌入QTimer 更方便。

    From the docs:

    QTimer 类提供了一个高级编程接口 单次定时器和定时器信号而不是事件。还有 一个QBasicTimerQTimer 更轻量级且更少的类 比直接使用计时器 ID 更笨拙。

    也别忘了阅读https://doc.qt.io/qt-5/timers.html

    【讨论】:

      【解决方案3】:

      您遇到此问题表明您的继承结构存在问题。

      您可以创建一个 BaseWithTimer 类,除了 1 个类之外的所有类都继承自该类。即:

      Base
        `- BaseWithTimer
         |    `- A
         |     - B
         `- C
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-07-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-12
        • 1970-01-01
        • 1970-01-01
        • 2017-08-20
        相关资源
        最近更新 更多