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

C++?兩個(gè)類通過智能指針進(jìn)行訪問操作代碼

 更新時(shí)間:2023年08月28日 09:23:52   作者:BoBo玩ROS  
在C++中,有多種方法可以實(shí)現(xiàn)將一個(gè)函數(shù)傳遞給另一個(gè)類,并在該類中調(diào)用該函數(shù),您可以選擇將函數(shù)作為回調(diào)函數(shù)或通過類的成員函數(shù)來實(shí)現(xiàn),這篇文章主要介紹了C++?兩個(gè)類通過智能指針進(jìn)行訪問操作,需要的朋友可以參考下

在C++中,有多種方法可以實(shí)現(xiàn)將一個(gè)函數(shù)傳遞給另一個(gè)類,并在該類中調(diào)用該函數(shù)。您可以選擇將函數(shù)作為回調(diào)函數(shù)或通過類的成員函數(shù)來實(shí)現(xiàn)。

1.將函數(shù)作為回調(diào)函數(shù)傳遞:

  • 定義一個(gè)函數(shù)指針類型,該函數(shù)指針類型與要傳遞的函數(shù)具有相同的簽名。
  • 在接收函數(shù)的類中,定義一個(gè)成員變量,用于存儲傳遞的函數(shù)指針。
  • 在接收函數(shù)的類中,定義一個(gè)函數(shù),該函數(shù)使用存儲的函數(shù)指針來調(diào)用傳遞的函數(shù)。
  • 在傳遞函數(shù)的類中,將函數(shù)指針傳遞給接收函數(shù)的類的成員變量。
  • 在接收函數(shù)的類中,通過調(diào)用成員函數(shù)來調(diào)用傳遞的函數(shù)。

下面是一個(gè)示例代碼:

// 定義函數(shù)指針類型
typedef void (*CallbackFunction)(int);
class Nav {
public:
    // 將函數(shù)指針作為參數(shù)傳遞給Follow類的函數(shù)
    void setCallback(CallbackFunction callback) {
        m_callback = callback;
    }
    // 調(diào)用回調(diào)函數(shù)
    void executeCallback() {
        if (m_callback) {
            m_callback(42);
        }
    }
private:
    CallbackFunction m_callback;
};
class Follow {
public:
    // 接收函數(shù),用于調(diào)用傳遞的函數(shù)
    void execute(int value) {
        // 在這里可以訪問Nav的成員變量
        // ...
        std::cout << "Received value: " << value << std::endl;
    }
};
int main() {
    Nav nav;
    Follow follow;
    // 將Follow類的execute函數(shù)作為回調(diào)函數(shù)傳遞給Nav類
    nav.setCallback(&Follow::execute);
    // 在Nav類中調(diào)用回調(diào)函數(shù)
    nav.executeCallback();
    return 0;
}

2.將Nav類的指針傳遞給Follow類:

  • 在Follow類中定義一個(gè)成員變量來存儲Nav類的指針。
  • 在Follow類中定義一個(gè)函數(shù),通過存儲的指針來調(diào)用Nav類的函數(shù)。
  • 在創(chuàng)建Follow類的實(shí)例時(shí),將Nav類的指針傳遞給Follow類的構(gòu)造函數(shù)。
  • 在Follow類中通過存儲的指針來調(diào)用Nav類的函數(shù)。

下面是一個(gè)示例代碼:

class Nav {
public:
    void execute(int value) {
        // 在這里可以訪問Nav的成員變量
        // ...
        std::cout << "Received value: " << value << std::endl;
    }
};
class Follow {
public:
    Follow(Nav* nav) : m_nav(nav) {}
    // 使用存儲的Nav指針來調(diào)用Nav類的函數(shù)
    void executeCallback() {
        if (m_nav) {
            m_nav->execute(42);
        }
    }
private:
    Nav* m_nav;
};
int main() {
    Nav nav;
    Follow follow(&nav);
    // 在Follow類中調(diào)用Nav類的函數(shù)
    follow.executeCallback();
    return 0;
}

對于這兩種方法,利弊如下:

  • 將函數(shù)作為回調(diào)函數(shù)傳遞:
    • 優(yōu)點(diǎn):在調(diào)用函數(shù)時(shí)更加靈活,可以在不同的類之間共享和傳遞函數(shù),可以傳遞不同的函數(shù)給同一個(gè)類的不同成員變量。
    • 缺點(diǎn):需要定義函數(shù)指針類型,可能會增加代碼的復(fù)雜性。
  • 將Nav類的指針傳遞給Follow類:
    • 優(yōu)點(diǎn):更容易訪問Nav類的成員變量和函數(shù),不需要定義函數(shù)指針類型。
    • 缺點(diǎn):在傳遞指針時(shí)需要注意指針的生命周期,可能需要手動管理內(nèi)存。

選擇哪種方法取決于您的具體需求和設(shè)計(jì)考慮。如果您需要在不同的類之間共享和傳遞函數(shù),并允許動態(tài)更改函數(shù),那么將函數(shù)作為回調(diào)函數(shù)傳遞可能更適合。如果您只需要在一個(gè)類中調(diào)用另一個(gè)類的函數(shù),并且需要訪問該類的成員變量,那么將類的指針傳遞給另一個(gè)類可能更合適。要給 path_follow 類傳遞名為 waypointCallback 的函數(shù),可以按照以下步驟進(jìn)行:

1.首先,在 path_follow 類的頭文件中聲明函數(shù) waypointCallback ,并指定其參數(shù)和返回類型。例如:

class path_follow {
public:
    void waypointCallback(const bool arrived_flag);
};

2.在 path_follow 類的實(shí)現(xiàn)文件中定義函數(shù) waypointCallback ,并實(shí)現(xiàn)其邏輯。例如:

void path_follow::waypointCallback(const bool arrived_flag) {
    // 在這里實(shí)現(xiàn)waypointCallback的邏輯
    if (arrived_flag) {
        // 如果到達(dá)了路徑點(diǎn),執(zhí)行某些操作
        // ...
    } else {
        // 如果未到達(dá)路徑點(diǎn),執(zhí)行其他操作
        // ...
    }
}

3.在需要使用 path_follow 類的地方,創(chuàng)建一個(gè) path_follow 對象,并將 waypointCallback 函數(shù)作為回調(diào)函數(shù)傳遞給 path_follow 類的成員變量。例如:

// 定義回調(diào)函數(shù)類型
typedef void (path_follow::*CallbackFunction)(const bool);
class Nav {
public:
    // 將回調(diào)函數(shù)作為參數(shù)傳遞給path_follow類的函數(shù)
    void setCallback(CallbackFunction callback) {
        m_callback = callback;
    }
    // 調(diào)用回調(diào)函數(shù)
    void executeCallback(const bool flag) {
        if (m_callback) {
            (this->*m_callback)(flag);
        }
    }
private:
    CallbackFunction m_callback;
};
int main() {
    Nav nav;
    path_follow pathFollow;
    // 將waypointCallback函數(shù)作為回調(diào)函數(shù)傳遞給Nav類
    nav.setCallback(&path_follow::waypointCallback);
    // 在Nav類中調(diào)用回調(diào)函數(shù)
    nav.executeCallback(true);
    return 0;
}

在上述代碼中,我們定義了一個(gè) CallbackFunction 類型,用于表示回調(diào)函數(shù)的類型。然后,在 Nav 類中,我們將 CallbackFunction 作為參數(shù)傳遞給 setCallback 函數(shù),并將 waypointCallback 函數(shù)的地址傳遞給 setCallback 函數(shù)。最后,在 executeCallback 函數(shù)中,我們通過調(diào)用成員函數(shù)指針來調(diào)用傳遞的回調(diào)函數(shù)。下面是一個(gè)示例代碼,演示了如何在 Nav 類中定義 path_follow 類,并在 Nav 類中定義回調(diào)函數(shù),并將其傳遞給 path_follow 類,然后在 path_follow 類中調(diào)用 Nav 類的回調(diào)函數(shù)。

class Nav {
public:
    void waypointCallback(const bool arrived_flag) {
        if (arrived_flag) {
            // 如果到達(dá)了路徑點(diǎn),執(zhí)行某些操作
            // ...
        } else {
            // 如果未到達(dá)路徑點(diǎn),執(zhí)行其他操作
            // ...
        }
    }
    void executeCallback() {
        // 在這里調(diào)用回調(diào)函數(shù)
        bool flag = true; // 假設(shè)傳遞給回調(diào)函數(shù)的參數(shù)
        waypointCallback(flag);
    }
};
class path_follow {
public:
    path_follow(Nav* nav) : m_nav(nav) {}
    void executeNavCallback() {
        // 在這里調(diào)用Nav類的回調(diào)函數(shù)
        bool flag = false; // 假設(shè)傳遞給回調(diào)函數(shù)的參數(shù)
        m_nav->waypointCallback(flag);
    }
private:
    Nav* m_nav;
};
int main() {
    Nav nav;
    path_follow pathFollow(&nav);
    // 在path_follow類中調(diào)用Nav類的回調(diào)函數(shù)
    pathFollow.executeNavCallback();
    return 0;
}

在上述代碼中,我們首先在 Nav 類中定義了 waypointCallback 回調(diào)函數(shù),并在 executeCallback 函數(shù)中調(diào)用該回調(diào)函數(shù)。然后,在 path_follow 類中,我們將 Nav 類的指針作為參數(shù)傳遞給 path_follow 類的構(gòu)造函數(shù),并在 executeNavCallback 函數(shù)中調(diào)用 Nav 類的回調(diào)函數(shù)。

如果您不想將 Nav 類的指針作為參數(shù)傳遞給 path_follow 類,而是將 Nav 類的函數(shù)傳遞給 path_follow 類,可以使用函數(shù)指針或者 std::function 來實(shí)現(xiàn)。下面是一個(gè)示例代碼,演示了如何使用函數(shù)指針來傳遞 Nav 類的函數(shù)給 path_follow 類:

#include <iostream>
class Nav {
public:
    void waypointCallback(const bool arrived_flag) {
        if (arrived_flag) {
            std::cout << "Waypoint reached!" << std::endl;
        } else {
            std::cout << "Waypoint not reached!" << std::endl;
        }
    }
};
class path_follow {
public:
    // 定義函數(shù)指針類型
    typedef void (Nav::*CallbackFunction)(const bool);
    path_follow(Nav* nav, CallbackFunction callback) : m_nav(nav), m_callback(callback) {}
    void executeNavCallback() {
        // 在這里調(diào)用Nav類的回調(diào)函數(shù)
        bool flag = true; // 假設(shè)傳遞給回調(diào)函數(shù)的參數(shù)
        (m_nav->*m_callback)(flag);
    }
private:
    Nav* m_nav;
    CallbackFunction m_callback;
};
int main() {
    Nav nav;
    // 定義函數(shù)指針
    path_follow::CallbackFunction callback = &Nav::waypointCallback;
    path_follow pathFollow(&nav, callback);
    // 在path_follow類中調(diào)用Nav類的回調(diào)函數(shù)
    pathFollow.executeNavCallback();
    return 0;
}

在上述代碼中,我們首先在 Nav 類中定義了 waypointCallback 回調(diào)函數(shù)。然后,在 path_follow 類中,我們使用 CallbackFunction 函數(shù)指針類型來表示 Nav 類的回調(diào)函數(shù)類型,并將其作為參數(shù)傳遞給 path_follow 類的構(gòu)造函數(shù)。在 executeNavCallback 函數(shù)中,我們通過函數(shù)指針調(diào)用 Nav 類的回調(diào)函數(shù)。

要將 this 轉(zhuǎn)換為 std::shared_ptr<PathFollow> 類型,您可以使用 std::shared_from_this() 函數(shù)。但是,要使用 std::shared_from_this() ,您的類必須繼承自 std::enable_shared_from_this 。

以下是一個(gè)示例代碼,展示了如何在 PathFollow 類中使用 std::shared_from_this()

#include <memory>
class PathFollow : public std::enable_shared_from_this<PathFollow> {
public:
    void someMethod() {
        // 將 this 轉(zhuǎn)換為 std::shared_ptr<PathFollow>
        std::shared_ptr<PathFollow> sharedThis = shared_from_this();
        // 使用 sharedThis 進(jìn)行操作
        // ...
    }
};
int main() {
    std::shared_ptr<PathFollow> pathFollow = std::make_shared<PathFollow>();
    pathFollow->someMethod();
    return 0;
}

在上述代碼中, PathFollow 類繼承自 std::enable_shared_from_this<PathFollow> ,這使得 PathFollow 類能夠使用 shared_from_this() 函數(shù)。

someMethod() 方法中,我們調(diào)用了 shared_from_this() ,將 this 轉(zhuǎn)換為 std::shared_ptr<PathFollow> 類型,并將其賦值給 sharedThis 變量,然后可以使用 sharedThis 進(jìn)行操作。

請注意,使用 std::shared_from_this() 的前提是,您必須在創(chuàng)建 PathFollow 對象時(shí)使用 std::shared_ptr<PathFollow> ,而不是使用裸指針。

希望這可以幫助到您!如果您有任何其他問題,請隨時(shí)提問。

到此這篇關(guān)于C++ 兩個(gè)類通過智能指針進(jìn)行訪問操作的文章就介紹到這了,更多相關(guān)C++ 智能指針內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 關(guān)于vector的常見用法詳解

    關(guān)于vector的常見用法詳解

    這篇文章主要介紹了關(guān)于vector的常見用法詳解,vector本身可以作為數(shù)組使用,而且在一些元素個(gè)數(shù)不確定的場合可以很好地節(jié)省空間,本文給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2023-02-02
  • C++數(shù)據(jù)結(jié)構(gòu)之紅黑樹的實(shí)現(xiàn)

    C++數(shù)據(jù)結(jié)構(gòu)之紅黑樹的實(shí)現(xiàn)

    紅黑樹在表意上就是一棵每個(gè)節(jié)點(diǎn)帶有顏色的二叉搜索樹,并通過對節(jié)點(diǎn)顏色的控制,使該二叉搜索樹達(dá)到盡量平衡的狀態(tài)。本文主要為大家介紹了C++中紅黑樹的原理及實(shí)現(xiàn),需要的可以參考一下
    2022-08-08
  • C++之stack類的代碼及其邏輯舉例詳解

    C++之stack類的代碼及其邏輯舉例詳解

    stack是一種容器適配器,專門用在具有后進(jìn)先出操作的上下文環(huán)境中,其刪除只能從容器的一端進(jìn)行元素的插入與提取操作,這篇文章主要介紹了C++之stack類的代碼及其邏輯的相關(guān)資料,需要的朋友可以參考下
    2025-09-09
  • C語言實(shí)現(xiàn)txt數(shù)據(jù)讀入內(nèi)存/CPU緩存實(shí)例詳解

    C語言實(shí)現(xiàn)txt數(shù)據(jù)讀入內(nèi)存/CPU緩存實(shí)例詳解

    這篇文章主要介紹了C語言實(shí)現(xiàn)txt數(shù)據(jù)讀入內(nèi)存/CPU緩存實(shí)例詳解的相關(guān)資料,這里對實(shí)現(xiàn)該函數(shù)進(jìn)行了代碼實(shí)現(xiàn),需要的朋友可以參考下
    2017-01-01
  • 帶頭結(jié)點(diǎn)單鏈表(詳解)

    帶頭結(jié)點(diǎn)單鏈表(詳解)

    這篇文章主要介紹了帶頭結(jié)點(diǎn)單鏈表?(詳解),需要的朋友可以參考下
    2023-07-07
  • C/C++獲取Windows平臺CPU占用率的方法

    C/C++獲取Windows平臺CPU占用率的方法

    最近在做系統(tǒng)信息相關(guān)的接口,為了實(shí)現(xiàn)跨平臺,故在linux和Windows平臺獲取占用率信息,文章主要介紹Windows下的方法,文中給出了參考代碼,需要的朋友可以參考下
    2023-12-12
  • C語言鏈表實(shí)現(xiàn)簡易通訊錄

    C語言鏈表實(shí)現(xiàn)簡易通訊錄

    這篇文章主要為大家詳細(xì)介紹了C語言鏈表實(shí)現(xiàn)簡易通訊錄,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-05-05
  • C語言實(shí)現(xiàn)逆波蘭式實(shí)例

    C語言實(shí)現(xiàn)逆波蘭式實(shí)例

    這篇文章介紹了C語言實(shí)現(xiàn)逆波蘭式實(shí)例,有需要的朋友可以參考一下
    2013-09-09
  • 實(shí)例講解C語言編程中的結(jié)構(gòu)體對齊

    實(shí)例講解C語言編程中的結(jié)構(gòu)體對齊

    這篇文章主要介紹了C語言編程中的結(jié)構(gòu)體對齊,值得注意的是一些結(jié)構(gòu)體對齊的例子在不同編譯器下結(jié)果可能會不同,需要的朋友可以參考下
    2016-04-04
  • C語言指針詳解

    C語言指針詳解

    這篇文章非常詳細(xì)的講解了C語言中指針的概念,包含多種方法,多種定義,全面的說明了C語言的特性
    2021-06-06

最新評論

恩平市| 茌平县| 洛阳市| 云林县| 高尔夫| 堆龙德庆县| 朝阳县| 九江县| 萨迦县| 惠水县| 衡东县| 惠安县| 商丘市| 鸡泽县| 黑水县| 武义县| 高青县| 黔江区| 布尔津县| 沧源| 祁阳县| 都昌县| 迁西县| 闵行区| 南陵县| 商城县| 紫云| 海晏县| 忻州市| 东方市| 潍坊市| 密云县| 南开区| 珠海市| 大悟县| 云霄县| 阿拉善右旗| 罗田县| 乌恰县| 望奎县| 南木林县|