最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

手寫 C++ Any 類:深入理解多態(tài)與模板(示例詳解)

 更新時(shí)間:2026年05月28日 10:39:25   作者:WWTYYDS_666  
這段代碼詳細(xì)介紹了使用C++實(shí)現(xiàn)類型擦除的類Placeholder,通過(guò)抽象基類和模板子類實(shí)現(xiàn)類型安全的存儲(chǔ)與操作,強(qiáng)調(diào)了RAII機(jī)制和拷貝交換法在內(nèi)存管理中的關(guān)鍵作用,感興趣的朋友一起看看吧

我們自己實(shí)現(xiàn)的閹割版 Any 類核心能力:用一個(gè)類存儲(chǔ)任意類型數(shù)據(jù)(int/自定義類/字符串等),底層依靠 抽象基類+模板子類 實(shí)現(xiàn)類型擦除

模塊1:頭文件包含

#include <iostream>   // 輸入輸出
#include <typeinfo>   // 類型識(shí)別:typeid 運(yùn)算符核心依賴
#include <utility>    // 標(biāo)準(zhǔn)庫(kù) swap 函數(shù)
#include <cassert>    // 斷言:類型不匹配時(shí)報(bào)錯(cuò)

講解

這四個(gè)頭文件是實(shí)現(xiàn) Any 類的基礎(chǔ):

  • typeinfo:提供 typeid,用于類型安全校驗(yàn)
  • utility:提供 std::swap,實(shí)現(xiàn)高效交換;
  • cassert:斷言,防止非法類型獲取數(shù)據(jù),保證程序安全。

模塊2:內(nèi)部抽象基類holder(類型擦除核心接口)

class holder
{
public:
    virtual ~holder(){}  // 虛析構(gòu)函數(shù)
    virtual const std::type_info& type() =0; // 純虛函數(shù):獲取類型
    virtual holder* clone()=0; // 純虛函數(shù):克隆對(duì)象
};

講解

  1. 定位Any 類的私有內(nèi)部抽象類,對(duì)外完全隱藏;
  2. 虛析構(gòu):必須加!保證多態(tài)刪除子類對(duì)象時(shí),析構(gòu)函數(shù)能被正確調(diào)用,防止內(nèi)存泄漏;
  3. 純虛函數(shù)
    • type():返回存儲(chǔ)數(shù)據(jù)的類型信息;
    • clone():深拷貝對(duì)象,支持 Any 的拷貝/賦值;
  4. 作用:定義統(tǒng)一接口,屏蔽具體類型差異,是類型擦除的基石。

模塊3:模板子類placeholder<T>(真正存儲(chǔ)數(shù)據(jù)的地方)

template<class T>
class placeholder:public holder
{
public:
    placeholder(const T&val):_val(val){}
    virtual const std::type_info& type(){return typeid(T);}
    virtual holder* clone(){return new placeholder(_val);}
public:
    T _val; // 真實(shí)存儲(chǔ)數(shù)據(jù)的變量
};

講解

  1. 模板類:T 是任意類型(int/Test/string…),真正實(shí)現(xiàn)存儲(chǔ)任意數(shù)據(jù);
  2. 繼承 holder:滿足多態(tài)要求,對(duì)外統(tǒng)一表現(xiàn)為 holder 類型;
  3. 構(gòu)造函數(shù):初始化成員變量 _val,存入數(shù)據(jù);
  4. 重寫純虛函數(shù):
    • type():返回當(dāng)前模板類型 T 的信息;
    • clone():創(chuàng)建自身副本,實(shí)現(xiàn)深拷貝;
  5. 核心:_val 是真實(shí)數(shù)據(jù)存儲(chǔ)位置,外部完全不可見(jiàn)。

模塊4:Any類核心成員 + 構(gòu)造/析構(gòu)函數(shù)

holder*_content; // 核心指針
// 默認(rèn)構(gòu)造:空對(duì)象
Any():_content(nullptr){}
// 模板構(gòu)造函數(shù):接收任意類型數(shù)據(jù)
template<class T>
Any(const T&val):_content(new placeholder<T>(val)){}
// 拷貝構(gòu)造函數(shù):深拷貝
Any(const Any&other):_content(other._content?other._content->clone():nullptr)
{}
// 析構(gòu)函數(shù):自動(dòng)釋放內(nèi)存
~Any(){delete _content;}

講解

  1. 核心成員 _content
    holder 基類指針,多態(tài)指向 placeholder<T> 子類對(duì)象,實(shí)現(xiàn)類型擦除;
  2. 默認(rèn)構(gòu)造:創(chuàng)建空的 Any 對(duì)象;
  3. 模板構(gòu)造:接收任意類型 T,創(chuàng)建 placeholder<T> 對(duì)象并賦值給指針;
  4. 拷貝構(gòu)造:調(diào)用 clone() 實(shí)現(xiàn)深拷貝,避免淺拷貝指針懸空;
  5. 析構(gòu)函數(shù):RAII 機(jī)制,自動(dòng)釋放內(nèi)存,無(wú)需手動(dòng)管理指針。

模塊5:交換函數(shù)swap(異常安全核心)

Any&swap(Any&other)
{
    std::swap(_content,other._content);
    return *this;
}

講解

  1. 作用:避免自賦值,先構(gòu)造一個(gè)臨時(shí)對(duì)象,再交換交換兩個(gè) Any 對(duì)象的內(nèi)部指針;
  2. 價(jià)值:是拷貝交換法的基礎(chǔ),讓賦值運(yùn)算符異常安全、無(wú)內(nèi)存泄漏、無(wú)需處理自賦值
  3. 極簡(jiǎn)高效:僅交換指針,不拷貝數(shù)據(jù),性能極高。

模塊6:數(shù)據(jù)獲取函數(shù)get<T>()(類型安全)

template<class T>
T*get()
{
    assert(typeid(T)==_content->type());
    return &((placeholder<T>*)_content)->_val;
}

講解

  1. 模板函數(shù):指定要獲取的類型 T
  2. 斷言校驗(yàn):類型不匹配直接終止程序,保證類型安全;
  3. 類型強(qiáng)轉(zhuǎn):將基類指針強(qiáng)轉(zhuǎn)為子類指針,獲取真實(shí)數(shù)據(jù) _val;
  4. 返回值:返回?cái)?shù)據(jù)指針,可讀寫內(nèi)部數(shù)據(jù)。

模塊7:賦值運(yùn)算符重載(兩種賦值方式)

// 賦值1:任意類型直接賦值給 Any
template<class T>
Any& operator=(const T&val)
{
    Any(val).swap(*this);
    return *this;
}
// 賦值2:Any 對(duì)象之間賦值
Any& operator=(const Any&other)
{
    Any(other).swap(*this);
    return *this;
}

講解

  1. 統(tǒng)一用法拷貝交換法,C++ 賦值運(yùn)算符最優(yōu)寫法;
  2. 原理
    ① 先創(chuàng)建臨時(shí)對(duì)象 Any(val) / Any(other);
    ② 交換臨時(shí)對(duì)象和當(dāng)前對(duì)象的指針;
    ③ 臨時(shí)對(duì)象析構(gòu),自動(dòng)釋放舊內(nèi)存;
  3. 優(yōu)點(diǎn):避免自賦值問(wèn)題,異常安全, 無(wú)內(nèi)存泄漏,代碼極簡(jiǎn)

模塊8:測(cè)試類Test(驗(yàn)證生命周期)

class Test
{
public:
    Test(){ std::cout<<"構(gòu)造"<<std::endl;}
    Test(const Test&t){ std::cout<<"拷貝構(gòu)造"<<std::endl;}
    ~Test(){ std::cout<<"析構(gòu)"<<std::endl;}
};

講解

自定義測(cè)試類,通過(guò)打印構(gòu)造/拷貝構(gòu)造/析構(gòu)日志,驗(yàn)證:

  1. Any 類能正常存儲(chǔ)自定義類型;
  2. 內(nèi)存管理正確,無(wú)泄漏;
  3. 拷貝/賦值行為符合預(yù)期。

模塊9:主函數(shù)測(cè)試(功能驗(yàn)證)

int main()
{
    Any a;
    {
        Test t;
        a=t;
    }
    a=10;
    int *pa=a.get<int>();
    std::cout<<*pa<<std::endl;
    return 0;
}

講解

  1. 測(cè)試空對(duì)象初始化;
  2. 測(cè)試自定義類型賦值
  3. 測(cè)試局部對(duì)象生命周期;
  4. 測(cè)試int 類型賦值 + 獲取數(shù)據(jù)
  5. 驗(yàn)證全程內(nèi)存自動(dòng)管理,無(wú)泄漏。

核心總結(jié)

  1. holder:抽象接口,定義統(tǒng)一規(guī)范;
  2. placeholder:模板子類,真正存數(shù)據(jù);
  3. _content:基類指針,多態(tài)+類型擦除核心;
  4. 拷貝交換法:賦值運(yùn)算符最優(yōu)解;
  5. RAII:構(gòu)造申請(qǐng)內(nèi)存,析構(gòu)自動(dòng)釋放。

到此這篇關(guān)于手寫 C++ Any 類:深入理解多態(tài)與模板(示例詳解)的文章就介紹到這了,更多相關(guān) C++ Any 類內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 簡(jiǎn)單說(shuō)說(shuō)STL的內(nèi)存管理

    簡(jiǎn)單說(shuō)說(shuō)STL的內(nèi)存管理

    <STL 源碼剖析>將其描述為空間配置器,理由是allocator可以將其它存儲(chǔ)介質(zhì)(例如硬盤)做為stl 容器的存儲(chǔ)空間。由于內(nèi)存是allocator管理的主要部分,因此,本文以STL內(nèi)存管理為出發(fā)點(diǎn)介紹allocator
    2013-09-09
  • c++中的字節(jié)序與符號(hào)位的問(wèn)題

    c++中的字節(jié)序與符號(hào)位的問(wèn)題

    這篇文章主要介紹了c++中的字節(jié)序與符號(hào)位的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單翻譯功能

    C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單翻譯功能

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單翻譯功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • C++多態(tài)特性之派生與虛函數(shù)與模板詳細(xì)介紹

    C++多態(tài)特性之派生與虛函數(shù)與模板詳細(xì)介紹

    這篇文章主要介紹了C++多態(tài)的特性派生與虛函數(shù)與模板,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧
    2022-09-09
  • Qt5.14.2使用虛擬鍵盤的關(guān)鍵代碼

    Qt5.14.2使用虛擬鍵盤的關(guān)鍵代碼

    對(duì)于Qwidget程序,使用qtvirtualkeyboard彈出鍵盤之后,鍵盤會(huì)浮于表面。使用VirtualkeyboardPushView模塊,自動(dòng)根據(jù)情況把輸入視圖往上面推移,這篇文章主要介紹了Qt5.14.2使用虛擬鍵盤的關(guān)鍵代碼,需要的朋友可以參考下
    2022-09-09
  • C語(yǔ)言入門篇--四大常量(字面,const修飾,宏,枚舉)及標(biāo)識(shí)符

    C語(yǔ)言入門篇--四大常量(字面,const修飾,宏,枚舉)及標(biāo)識(shí)符

    本篇文章是c語(yǔ)言基礎(chǔ)篇,主要講述一下常量,常量即不可被直接修改的量(const修飾的常變量可間接修改,后續(xù)文章會(huì)繼續(xù)說(shuō)明)請(qǐng)大家持續(xù)關(guān)注腳本之家
    2021-08-08
  • 簡(jiǎn)單介紹C++中變量的引用

    簡(jiǎn)單介紹C++中變量的引用

    這篇文章主要簡(jiǎn)單介紹了C++中變量的引用,是C++入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-09-09
  • 最新評(píng)論

    昆明市| 永吉县| 泾川县| 原平市| 景谷| 辽阳县| 鸡东县| 昌乐县| 庆阳市| 香港| 安义县| 玛沁县| 天门市| 青海省| 郁南县| 镇安县| 礼泉县| 湖口县| 茂名市| 福海县| 泾阳县| 察哈| 客服| 临漳县| 广宗县| 定远县| 江川县| 广河县| 准格尔旗| 万宁市| 伊春市| 常熟市| 柘荣县| 海门市| 三河市| 肃南| 苍山县| 历史| 沂源县| 綦江县| 八宿县|