<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      Qt小知識(shí)3.Q_DECLARE_PRIVATE和Q_DECLARE_PUBLIC

      1 引言

      當(dāng)使用Qt開發(fā)C++應(yīng)用程序時(shí),可以使用Q_DECLARE_PUBLIC、Q_DECLARE_PRIVATE、Q_D和Q_Q宏來幫助隱藏和公開類的私有成員和方法。

      先來看看它們長什么樣子:

       #define Q_DECLARE_PRIVATE(Class) \
       inline Class##Private* d_func() { return reinterpret_cast<Class##Private *>(qGetPtrHelper(d_ptr)); } \
       inline const Class##Private* d_func() const { return reinterpret_cast<const Class##Private *>(qGetPtrHelper(d_ptr)); } \
       friend class Class##Private;  
      
       #define Q_DECLARE_PUBLIC(Class) \
       inline Class* q_func() { return static_cast<Class *>(q_ptr); } \
       inline const Class* q_func() const { return static_cast<const Class *>(q_ptr); } \
       friend class Class;
      
      #define Q_D(Class) Class##Private * const d = d_func()
      #define Q_Q(Class) Class * const q = q_func()
      

      Q_DECLARE_PUBLIC 和 Q_DECLARE_PRIVATE 這兩個(gè)宏一般成對使用,用于實(shí)現(xiàn) PIMPL 設(shè)計(jì)模式,這樣可以達(dá)到隱藏實(shí)現(xiàn)的目的。

      2 實(shí)際案例

      假設(shè)現(xiàn)在正在開發(fā)一個(gè)音頻播放器應(yīng)用程序,其中有一個(gè)名為AudioPlayer的類負(fù)責(zé)播放音頻文件,這個(gè)類有一些私有成員和方法,需要通過一些公共函數(shù)和方法來訪問。

      首先,在AudioPlayer類的頭文件中,使用Q_DECLARE_PRIVATE宏來聲明私有數(shù)據(jù)指針,這個(gè)指針將被用于存儲(chǔ)私有數(shù)據(jù):

      #ifndef AUDIOPLAYER_H
      #define AUDIOPLAYER_H
      
      #include <QObject>
      
      class AudioPlayerPrivate;
      
      class AudioPlayer : public QObject
      {
          Q_OBJECT
          Q_DECLARE_PRIVATE(AudioPlayer)
      
      public:
          explicit AudioPlayer(QObject *parent = nullptr);
          ~AudioPlayer();
      
          void play(const QString& audioFile);
          void stop();
      
      private:
          QScopedPointer<AudioPlayerPrivate> d_ptr;
      };
      
      #endif // AUDIOPLAYER_H
      
      #include "audioplayer.h"
      #include "audioplayer_p.h"
      
      AudioPlayer::AudioPlayer(QObject *parent)
          : QObject(parent),
            d_ptr(new AudioPlayerPrivate(this))
      {
      }
      
      AudioPlayer::~AudioPlayer()
      {
      }
      
      void AudioPlayer::play(const QString &audioFile)
      {
          Q_D(AudioPlayer);
          // 使用d指針可以訪問私有成員和方法
          d->playInternal(audioFile);
      }
      
      void AudioPlayer::stop()
      {
          Q_D(AudioPlayer);
          // 使用d指針可以訪問私有成員和方法
          d->stopInternal();
      }
      

      在這個(gè)例子中,使用了Q_D宏來定義一個(gè)d指針,該指針指向AudioPlayer類的私有數(shù)據(jù)。

      在使用Q_D宏之前,需要在AudioPlayer類實(shí)現(xiàn)文件中包含一個(gè)名為audioplayer_p.h的文件,其中聲明了AudioPlayerPrivate類,使用Q_DECLARE_PUBLIC宏來聲明公共類的指針:

      #ifndef AUDIOPLAYER_P_H
      #define AUDIOPLAYER_P_H
      
      class AudioPlayer;
      class AudioPlayerPrivate
      {
          Q_DECLARE_PUBLIC(AudioPlayer)
      
      public:
          AudioPlayerPrivate(AudioPlayer *audioPlayer);
      
          void playInternal(const QString &audioFile);
          void stopInternal();
      
      private:
          AudioPlayer *q_ptr;
      };
      
      #endif // AUDIOPLAYER_P_H
      

      然后,在audioplayer_p.cpp文件中,可以使用Q_Q宏來定義公共類的指針:

      #include "audioplayer_p.h"
      #include "audioplayer.h"
      
      AudioPlayerPrivate::AudioPlayerPrivate(AudioPlayer *audioPlayer)
          : q_ptr(audioPlayer)
      {
      }
      
      void AudioPlayerPrivate::playInternal(const QString &audioFile)
      {
          // 使用q指針可以訪問公共成員和方法
          Q_Q(AudioPlayer);
          // ...
      }
      
      void AudioPlayerPrivate::stopInternal()
      {
          // 使用q指針可以訪問公共成員和方法
          Q_Q(AudioPlayer);
          // ...
      }
      

      在這個(gè)例子中,使用了Q_Q宏來定義一個(gè)q指針,該指針指向AudioPlayer類。

      3 總結(jié)

      通過使用Q_DECLARE_PRIVATE、Q_DECLARE_PUBLIC、Q_D和Q_Q宏,可以在Qt應(yīng)用程序中實(shí)現(xiàn)類的封裝和隱藏,同時(shí)提供公共接口來訪問私有成員和方法。這樣可以有效地封裝類的內(nèi)部實(shí)現(xiàn)細(xì)節(jié),提高代碼的可讀性和可維護(hù)性。

      posted @ 2024-01-02 17:43  Qt小羅  閱讀(1208)  評(píng)論(0)    收藏  舉報(bào)
      主站蜘蛛池模板: 亚洲欧美激情在线一区| 草裙社区精品视频播放| 高级艳妇交换俱乐部小说| 亚洲精品久久久久久婷婷| 亚洲暴爽av天天爽日日碰| 色午夜久久男人操女人| 97视频精品全国免费观看| 国产自在自线午夜精品| 亚洲午夜无码久久久久小说| 夜夜爽日日澡人人添| 日本老熟女一二三区视频| 人妻少妇精品中文字幕| 亚洲色成人一区二区三区| 国偷自产一区二区三区在线视频 | 老司机精品影院一区二区三区| 国产午夜精品久久精品电影| 欧美黑人乱大交| 久久国产免费观看精品3| 国产高清视频一区二区乱| 久久青草国产精品一区| 日韩一区二区三区日韩精品| 久久精品第九区免费观看| 欧美激情a∨在线视频播放| 午夜福利国产精品视频| 亚洲VA成无码人在线观看天堂 | 肉大捧一进一出免费视频| 亚洲日韩中文字幕在线播放| 台湾佬自拍偷区亚洲综合| 成人欧美一区二区三区在线观看| 中文字幕有码日韩精品| 亚洲人成网站在线播放动漫| 午夜爽爽爽男女污污污网站| 亚洲精品一二三四区| 精品无码av无码专区| av色国产色拍| 99久久国产综合精品成人影院| 亚洲午夜无码久久久久蜜臀AV | 亚洲欧美自偷自拍视频图片| 欧美黑人又粗又大久久久| 中文字幕久久六月色综合| 亚洲 日本 欧洲 欧美 视频|