精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

C++如何解決頭文件循環引用問題?至少給出兩種方法

開發 前端
在 A.h 和 B.h 中,我們只前向聲明了各自的實現類 Impl,而沒有包含對方的頭文件。這樣,頭文件之間不再存在直接的依賴關系,從而避免了循環引用。

頭文件循環引用是C++編程中常見的問題,通常發生在兩個或多個頭文件相互包含對方的情況下。這種情況下,編譯器可能會陷入無限遞歸,導致編譯錯誤或不正確的代碼生成。 

1、問題描述

首先看一個典型的循環引用場景: 

// a.h
#ifndef A_H
#define A_H
#include "b.h"

class A {
    B* b_ptr;  // 需要完整的B類定義
public:
    void doSomething();
};
#endif

// b.h
#ifndef B_H
#define B_H
#include "a.h"

class B {
    A* a_ptr;  // 需要完整的A類定義
public:
    void doSomething();
};
#endif

這會導致編譯錯誤,因為兩個頭文件互相包含。 

2、解決方案

2.1 前向聲明

最常用也是最簡單的方法: 

// a.h
#ifndef A_H
#define A_H

class B;  // 前向聲明

class A {
    B* b_ptr;  // 只需要不完整類型聲明
public:
    void doSomething();
};
#endif

// b.h
#ifndef B_H
#define B_H

class A;  // 前向聲明

class B {
    A* a_ptr;  // 只需要不完整類型聲明
public:
    void doSomething();
};
#endif

// a.cpp
#include "a.h"
#include "b.h"  // 在實現文件中包含完整定義

void A::doSomething() {
    b_ptr->doSomething();
}

// b.cpp
#include "b.h"
#include "a.h"  // 在實現文件中包含完整定義

void B::doSomething() {
    a_ptr->doSomething();
}

2.2 接口分離原則

循環引用的根本原因是設計上的問題。通過重構代碼,減少類之間的直接依賴,可以從根本上解決問題。例如,可以考慮將共同的功能提取到一個獨立的模塊中,或者使用接口或抽象類來解耦類之間的關系 

假設 A 和 B 之間有很強的依賴關系,可以通過引入一個中間類 C 來解耦: 

引入類C 

// C.h
#ifndef C_H
#define C_H

class C {
public:
    virtual void doSomething() = 0;
    virtual ~C() = default;
};

#endif // C_H

類A 

// A.h
#ifndef A_H
#define A_H

#include "C.h"  // 只依賴于 C

class A:public C
{
public:
    C* m_Pc;;
public:
    void setProcessor(C* p) { m_Pc = p; }
    void doWork() { m_Pc->doSomething(); }

    void doSomething() override
    {
        std::cout << "A do something" << std::endl;
    }
};

#endif // A_H

類B 

// B.h
#ifndef B_H
#define B_H

#include "C.h"  // 只依賴于 C

class B : public C
{
public:
    C* m_Pc;;
public:
    void setProcessor(C* p) { m_Pc = p; }
    void doWork() { m_Pc->doSomething(); }

public:
    void doSomething() override
    {
        std::cout << "B Do Something" << std::endl;
    }
};
#endif // B_H

main函數使用 

#include <iostream>
#include "a.h"
#include "b.h"
#include "c.h"
int main()
{
        {
                C* pC = new B();
                A a;
                a.setProcessor(pC);
                a.doWork();
        }
        {
                C* pC = new A();
                B b;
                b.setProcessor(pC);
                b.doWork();
        }
        return 0;
}

運行main函數,a.dowork輸出是B的內容,b.dowork是A的內容。 

2.3 PIMPL模式

PIMPL模式不能直接解決循環依賴問題,但是這種做法很常見,所以這里簡單介紹下 

PIMPL(Pointer to IMPLementation,指向實現的指針)模式是一種用于隱藏類的實現細節的設計模式。它通過將類的私有成員和實現細節移到一個獨立的實現類中,并在頭文件中只保留一個指向該實現類的指針,PIMPL 模式的核心思想是將類的接口與其實現分離。 

使用 PIMPL 模式重構代碼 :

類A 

// A.h
#ifndef A_H
#define A_H

class A {
public:
    A();
    ~A();
    void doSomething();

private:
    class Impl;  // 前向聲明實現類
    std::unique_ptr<Impl> pImpl;  // 指向實現類的智能指針
};

#endif // A_H

// A.cpp
#include "A.h"
#include "B.h"  // 只在 .cpp 文件中包含 B 的頭文件

class A::Impl {
public:
    B* m_B;  // 實現類中持有 B 的指針
    void doSomething() {
        if (m_B) {
            m_B->doSomething();
        }
    }
};

A::A() : pImpl(std::make_unique<Impl>()) {
    pImpl->m_B = nullptr;
}

A::~A() = default;

void A::doSomething() {
    pImpl->doSomething();
}

類B 

// B.h
#ifndef B_H
#define B_H
class B {
public:
    B(); 
    ~B();
    void doSomething();

private:
    class Impl;  // 前向聲明實現類
    std::unique_ptr<Impl> pImpl;  // 指向實現類的智能指針
};

#endif // B_H

// B.cpp
#include "B.h"
#include "A.h"  // 只在 .cpp 文件中包含 A 的頭文件

class B::Impl {
public:
    A* m_A;  // 實現類中持有 A 的指針
    void doSomething() {
        if (m_A) {
            m_A->doSomething();
        }
    }
};

B::B() : pImpl(std::make_unique<Impl>()) {
    pImpl->m_A = nullptr;
}

B::~B() = default;

void B::doSomething() {
    pImpl->doSomething();
}

代碼解析 :

前向聲明:在 A.h 和 B.h 中,我們只前向聲明了各自的實現類 Impl,而沒有包含對方的頭文件。這樣,頭文件之間不再存在直接的依賴關系,從而避免了循環引用。 

實現類在 .cpp 文件中定義:A::Impl 和 B::Impl 的定義被移到了 .cpp 文件中。這意味著只有在編譯時,A.cpp 和 B.cpp 才會引入對方的頭文件,而不是在頭文件中直接包含。 

智能指針:我們使用 std::unique_ptr 來管理 Impl 對象的生命周期,確保資源的自動釋放,避免內存泄漏。 

總結

優先使用前向聲明 

當只需要指針或引用時,前向聲明是最簡單的解決方案 

減少編譯依賴,加快編譯速度 

合理拆分頭文件 

將相關的聲明放在同一個頭文件中 

避免在頭文件中包含不必要的其他頭文件 

使用接口抽象 

通過抽象接口解耦具體實現 

遵循依賴倒置原則 

實現邏輯放在cpp文件 

頭文件只包含聲明 

具體實現放在cpp文件中 

使用PIMPL模式 

對于復雜的類,考慮使用PIMPL模式 

可以完全隱藏實現細節,提供更好的ABI兼容性 

責任編輯:武曉燕 來源: CppPlayer
相關推薦

2025-08-21 13:40:58

頭文件循環項目

2009-08-17 08:29:00

c#刪除指定文件

2011-04-25 09:53:31

C++mysql

2011-05-24 09:18:59

C++連接mysql數據庫

2024-12-06 16:00:00

C++頭文件

2010-01-15 18:46:08

C++程序代碼

2009-08-05 13:34:18

C#日期相減

2010-05-24 15:08:46

MySQL訪問權限

2009-09-02 16:21:02

C#解析Html

2010-02-02 13:04:03

C++頭文件

2019-11-26 14:30:20

Spring循環依賴Java

2021-03-06 19:45:23

項目文件代碼

2010-08-02 16:58:08

Flex配置文件

2010-08-04 17:41:52

掛載NFS

2013-01-09 10:36:28

mysql主從不同步

2009-08-21 18:02:41

C#快捷鍵

2010-01-25 17:55:38

C++頭文件

2010-07-26 15:42:34

Perl模塊

2010-06-17 12:48:05

livecd 修復Gr

2009-11-06 09:48:40

WCF服務
點贊
收藏

51CTO技術棧公眾號

亚洲精品一二三区区别| 亚洲黄色网址| 国产精品18久久久久| 久久人91精品久久久久久不卡| 最近日本中文字幕| 二区三区不卡| 亚洲欧美日韩久久精品| a级国产乱理论片在线观看99| 亚洲男人的天堂在线视频| 国产伦精品一区二区三区视频| 欧美喷水一区二区| 国产美女在线一区| 在线看黄色av| 波多野洁衣一区| 国产精品一区二区三区在线播放| 亚洲色婷婷一区二区三区| 久久久久观看| 91精品国产欧美一区二区18| 99精品人妻少妇一区二区| 99re在线视频| 久久久亚洲欧洲日产国码αv| 成人a免费视频| 成年人视频在线免费看| 午夜激情久久| 亚洲午夜小视频| 免费观看一区二区三区| 日本h片久久| 日韩欧美精品中文字幕| 国产精品视频二| 午夜在线免费观看视频| 国产视频亚洲色图| 精品一区二区视频| 99久久精品国产一区色| 日韩电影免费一区| 欧洲成人免费aa| 久草精品视频在线观看| 外国成人激情视频| 亚洲视频在线观看| 漂亮人妻被黑人久久精品| 亚洲综合资源| 欧美日韩不卡在线| 可以在线看的黄色网址| xxx.xxx欧美| 一区二区三区在线免费播放| 一本—道久久a久久精品蜜桃| 可以在线观看的av网站| 不卡一二三区首页| 国产精品视频入口| 亚洲国产999| 国产成人欧美日韩在线电影| 91免费版网站入口| 一级黄色片免费看| 久久99国产精品免费网站| 国产精品入口福利| 亚洲午夜在线播放| 麻豆免费精品视频| 国产欧美一区二区三区久久| 中文字幕在线播放不卡| 免费成人在线观看| 国产一区二区丝袜高跟鞋图片| 日韩国产亚洲欧美| 毛片av中文字幕一区二区| 国产一区二区丝袜| 国产黄a三级三级看三级| 国产精品资源在线| 国产精品视频免费观看| 神马久久久久久久久久| 91视频com| 欧美一区二区影视| 国产精品久久一区二区三区不卡| 欧美国产精品专区| 亚洲一区二区三区乱码| 久草中文在线| 亚洲国产你懂的| 欧美亚洲精品一区二区| 日韩伦理精品| 欧美三区在线观看| 深夜做爰性大片蜜桃| 国内自拍欧美| 一本一本久久a久久精品牛牛影视 一本色道久久综合亚洲精品小说 一本色道久久综合狠狠躁篇怎么玩 | 日韩精品在线网站| 欧美熟妇精品一区二区蜜桃视频 | 亚洲人一区二区| 好吊日视频在线观看| 亚洲在线视频网站| 欧美 国产 小说 另类| 国产亚洲欧美日韩精品一区二区三区 | 国产精品拍拍拍| 日韩亚洲国产免费| 精品国产乱码久久久久久图片 | 一区二区三区精品在线观看| 黄色一级片在线看| 日韩精品99| 欧美一区二区视频网站| 午夜久久久久久久| 93在线视频精品免费观看| 久久久女人电视剧免费播放下载| 国产熟妇一区二区三区四区| 国产中文一区二区三区| 久久久综合香蕉尹人综合网| 日本中文字幕视频在线| 五月激情综合网| www.日本一区| 日本中文字幕在线一区| 深夜福利亚洲导航| 日韩免费一级片| 久久99精品视频| 久久偷看各类wc女厕嘘嘘偷窃| 黄色小网站在线观看| 福利一区视频在线观看| 久久综合桃花网| 免费看av成人| 91国产在线精品| 国产精品日韩无码| 久久久久9999亚洲精品| av 日韩 人妻 黑人 综合 无码| 国产日韩另类视频一区| 亚洲激情在线观看视频免费| 成人做爰视频网站| 天堂一区二区在线免费观看| 国产精品久久亚洲| 国产视频中文字幕在线观看| 色丁香久综合在线久综合在线观看| 无人码人妻一区二区三区免费| 欧美日韩一区二区综合 | 日本一道高清亚洲日美韩| 欧美不卡激情三级在线观看| 黑人狂躁日本娇小| 久久精品首页| 狠狠色综合网站久久久久久久| h片在线播放| 欧美日韩精品电影| 免费在线观看a视频| 一本综合久久| 国产免费一区| 深夜国产在线播放| 91精品国产综合久久久蜜臀粉嫩 | 色婷婷综合视频| 一区二区久久久久久| 中文字幕 欧美日韩| 欧美日韩久久精品| 国产精品免费一区二区三区都可以| 欧洲天堂在线观看| 欧美日韩另类字幕中文| 香港三日本8a三级少妇三级99| 狠狠入ady亚洲精品| 亚洲自拍偷拍第一页| 成人在线播放免费观看| 欧美一级搡bbbb搡bbbb| 国产极品国产极品| 美女视频网站久久| 一本一本a久久| 亚洲欧美在线综合| 久久亚洲电影天堂| av中文在线观看| 亚洲曰韩产成在线| 男男一级淫片免费播放| 99国产精品| 蜜桃麻豆91| 秋霞国产精品| 久久综合电影一区| 性生活三级视频| 午夜激情久久久| 日本丰满少妇裸体自慰 | 国产日韩欧美久久| 99久久综合| 超碰97人人在线| h片在线观看下载| 精品一区二区三区四区在线| 波多野结衣大片| 国产精品免费aⅴ片在线观看| 天天看片天天操| 亚洲午夜91| 欧美精品一区二区三区四区五区 | 91影视免费在线观看| www.久久ai| 亚洲国产精品久久久| 国产又大又粗又爽| 国产精品的网站| 日本精品一二三| 美女被久久久| 一本大道东京热无码aⅴ| 麻豆视频一区| 91精品久久久久久| 黄视频在线免费看| 亚洲新中文字幕| 精品国产伦一区二区三区| 亚洲成av人片观看| 丁香六月激情综合| 国产黄色91视频| 亚洲中文字幕无码不卡电影| 我不卡伦不卡影院| 免费在线一区二区| 久久久91麻豆精品国产一区| 欧美一级高清免费播放| 婷婷成人激情| 日韩精品在线观看一区| 国产精品欧美综合亚洲| 欧美三级xxx| 特级片在线观看| 国产欧美一二三区| 最新中文字幕日本| 久久99这里只有精品| 国产一级爱c视频| 外国成人免费视频| 清纯唯美一区二区三区| 国产精品xxx在线观看| 国产伦精品一区二区三区精品视频| 黑人玩欧美人三根一起进| 在线视频精品一| 亚洲三区在线观看无套内射| 91精品麻豆日日躁夜夜躁| 伊人久久久久久久久久久久| 亚洲第一福利视频在线| 91高清免费看| 中文字幕精品一区二区三区精品| 亚洲av成人片无码| 久久99国产精品久久99| 人妻无码视频一区二区三区| 午夜日韩av| 先锋影音男人资源| 99久久.com| 视频一区二区三区免费观看| 日韩动漫一区| 国产精品日韩高清| eeuss国产一区二区三区四区| 成人性生交xxxxx网站| 精品日本视频| 国产激情综合五月久久| sese综合| 奇米成人av国产一区二区三区| 不卡av免费观看| 欧美精品久久久久| 日本aa在线| 九九精品视频在线观看| 成人黄色网址| 久久精品国产精品| 午夜激情视频在线观看| 尤物tv国产一区| aaa在线观看| 日韩在线免费av| 欧美三级黄网| 精品国产一区二区三区久久久狼| freemovies性欧美| 国产一区二区免费| 成人p站proumb入口| 亚洲丝袜一区在线| 国产乱子伦三级在线播放| 亚洲欧美www| 每日更新在线观看av| 亚洲日本欧美中文幕| 国产视频三级在线观看播放| 一区二区福利视频| gogogo高清在线观看免费完整版| 色吧影院999| 麻豆tv在线| 九九热99久久久国产盗摄| 欧洲一区二区三区| 久久久久女教师免费一区| 川上优av中文字幕一区二区| 欧美一区在线直播| 亚洲wwww| 成人久久精品视频| 97久久亚洲| 欧美第一黄网| 成人精品亚洲| 在线播放 亚洲| 亚洲视频精品| 已婚少妇美妙人妻系列| 精品一区二区三区在线观看国产 | 欧美成人黑人xx视频免费观看| 最新国产露脸在线观看| 久久久亚洲欧洲日产国码aⅴ| 涩涩视频网站在线观看| 国产美女搞久久| 91精品久久久久久综合五月天| 国产亚洲欧美另类一区二区三区| 综合国产视频| 精品日韩在线播放| 日韩网站在线| 视频在线观看免费高清| 国产高清视频一区| 日韩人妻无码一区二区三区| 最新欧美精品一区二区三区| 国产精品美女毛片真酒店| 91精品福利视频| www.色呦呦| 亚洲一区二区久久久| 超碰在线免费公开| 57pao成人永久免费视频| 韩国精品视频在线观看| 国产精品播放| 国产精品久久天天影视| 丰满爆乳一区二区三区| 精品一二三四区| 一级特级黄色片| 亚洲精选视频在线| 7799精品视频天天看| 日韩一级片在线观看| 精品视频二区| 国内精品视频一区| 91精品福利观看| 欧美亚洲精品日韩| 黄色精品免费| 欧美成在线视频| 极品魔鬼身材女神啪啪精品| 岛国av在线不卡| 国产成人精品亚洲精品色欲| 国产一区二区三区在线看 | 偷窥自拍亚洲色图精选| 亚洲一区二区三区涩| 一区二区视频欧美| 99日在线视频| 国产日韩欧美高清| 91午夜视频在线观看| 日韩一级在线观看| 日本三级视频在线播放| 欧美一级免费视频| 国产精品99久久免费观看| 国产麻豆电影在线观看| 久久亚洲影院| 99久久国产精| 天天色 色综合| 精品国产乱码久久久久久蜜臀网站| 中文字幕欧美日韩| 成人爱爱网址| 久久人人九九| 亚洲电影成人| 免费在线观看日韩av| 亚洲色图一区二区| 一级做a爱片久久毛片| 国产一区二区三区视频在线观看| 国产美女精品写真福利视频| 91沈先生播放一区二区| 天天av综合| 亚洲一级免费在线观看| 国产亚洲欧美日韩日本| aaaaaa毛片| 亚洲欧美在线免费| 伊人久久精品一区二区三区| 久精品国产欧美| 亚洲作爱视频| 亚洲欧美在线不卡| 欧美特级www| 全色精品综合影院| 日韩av电影国产| 精品国内自产拍在线观看视频 | 日韩精品――中文字幕| 精品成人在线观看| av中文资源在线资源免费观看| 国产精品视频福利| 99人久久精品视频最新地址| 一区二区三区少妇| 一本大道久久a久久综合| 女人天堂在线| 国产精品成人免费电影| 狠狠综合久久av一区二区蜜桃| 成人免费毛片播放| 日本一区二区高清| 91午夜交换视频| 久久伊人精品天天| 91成人短视频| 国产99久久九九精品无码| 久久九九久久九九| 在线观看中文字幕网站| 久久久精品网站| xxxxxhd亚洲人hd| 女人天堂av手机在线| 国产亚洲欧美在线| 一区二区国产欧美| 欧美成人中文字幕在线| 另类ts人妖一区二区三区| 免费日韩视频在线观看| 国产精品久久久久四虎| 国产高清第一页| 欧美一级电影在线| 欧美成人激情| 老熟女高潮一区二区三区| 色香蕉成人二区免费| 日韩精品成人av| 国产区二精品视| 日本不卡一区二区三区| 成人在线观看小视频| 日韩av网址在线| 久久精品超碰| 国产av熟女一区二区三区 | 美女视频久久久| 精品国产免费视频| 巨胸喷奶水www久久久免费动漫| av电影一区二区三区| 99久久精品费精品国产一区二区| 久久精品99北条麻妃| 久久91精品国产91久久久| 一区三区在线欧| 色综合五月婷婷| 都市激情亚洲色图| 成人免费网址| 日韩精品久久一区| 国产成人免费视频网站| 国产日韩在线免费观看|