C++?兩個類通過智能指針進行訪問操作代碼
在C++中,有多種方法可以實現(xiàn)將一個函數(shù)傳遞給另一個類,并在該類中調(diào)用該函數(shù)。您可以選擇將函數(shù)作為回調(diào)函數(shù)或通過類的成員函數(shù)來實現(xiàn)。
1.將函數(shù)作為回調(diào)函數(shù)傳遞:
- 定義一個函數(shù)指針類型,該函數(shù)指針類型與要傳遞的函數(shù)具有相同的簽名。
- 在接收函數(shù)的類中,定義一個成員變量,用于存儲傳遞的函數(shù)指針。
- 在接收函數(shù)的類中,定義一個函數(shù),該函數(shù)使用存儲的函數(shù)指針來調(diào)用傳遞的函數(shù)。
- 在傳遞函數(shù)的類中,將函數(shù)指針傳遞給接收函數(shù)的類的成員變量。
- 在接收函數(shù)的類中,通過調(diào)用成員函數(shù)來調(diào)用傳遞的函數(shù)。
下面是一個示例代碼:
// 定義函數(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類中定義一個成員變量來存儲Nav類的指針。
- 在Follow類中定義一個函數(shù),通過存儲的指針來調(diào)用Nav類的函數(shù)。
- 在創(chuàng)建Follow類的實例時,將Nav類的指針傳遞給Follow類的構(gòu)造函數(shù)。
- 在Follow類中通過存儲的指針來調(diào)用Nav類的函數(shù)。
下面是一個示例代碼:
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ào)用函數(shù)時更加靈活,可以在不同的類之間共享和傳遞函數(shù),可以傳遞不同的函數(shù)給同一個類的不同成員變量。
- 缺點:需要定義函數(shù)指針類型,可能會增加代碼的復雜性。
- 將Nav類的指針傳遞給Follow類:
- 優(yōu)點:更容易訪問Nav類的成員變量和函數(shù),不需要定義函數(shù)指針類型。
- 缺點:在傳遞指針時需要注意指針的生命周期,可能需要手動管理內(nèi)存。
選擇哪種方法取決于您的具體需求和設計考慮。如果您需要在不同的類之間共享和傳遞函數(shù),并允許動態(tài)更改函數(shù),那么將函數(shù)作為回調(diào)函數(shù)傳遞可能更適合。如果您只需要在一個類中調(diào)用另一個類的函數(shù),并且需要訪問該類的成員變量,那么將類的指針傳遞給另一個類可能更合適。要給 path_follow
類傳遞名為 waypointCallback
的函數(shù),可以按照以下步驟進行:
1.首先,在 path_follow
類的頭文件中聲明函數(shù) waypointCallback
,并指定其參數(shù)和返回類型。例如:
class path_follow { public: void waypointCallback(const bool arrived_flag); };
2.在 path_follow
類的實現(xiàn)文件中定義函數(shù) waypointCallback
,并實現(xiàn)其邏輯。例如:
void path_follow::waypointCallback(const bool arrived_flag) { // 在這里實現(xiàn)waypointCallback的邏輯 if (arrived_flag) { // 如果到達了路徑點,執(zhí)行某些操作 // ... } else { // 如果未到達路徑點,執(zhí)行其他操作 // ... } }
3.在需要使用 path_follow
類的地方,創(chuàng)建一個 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; }
在上述代碼中,我們定義了一個 CallbackFunction
類型,用于表示回調(diào)函數(shù)的類型。然后,在 Nav
類中,我們將 CallbackFunction
作為參數(shù)傳遞給 setCallback
函數(shù),并將 waypointCallback
函數(shù)的地址傳遞給 setCallback
函數(shù)。最后,在 executeCallback
函數(shù)中,我們通過調(diào)用成員函數(shù)指針來調(diào)用傳遞的回調(diào)函數(shù)。下面是一個示例代碼,演示了如何在 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) { // 如果到達了路徑點,執(zhí)行某些操作 // ... } else { // 如果未到達路徑點,執(zhí)行其他操作 // ... } } void executeCallback() { // 在這里調(diào)用回調(diào)函數(shù) bool flag = true; // 假設傳遞給回調(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; // 假設傳遞給回調(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
來實現(xiàn)。下面是一個示例代碼,演示了如何使用函數(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; // 假設傳遞給回調(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
。
以下是一個示例代碼,展示了如何在 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 進行操作 // ... } }; 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
進行操作。
請注意,使用 std::shared_from_this()
的前提是,您必須在創(chuàng)建 PathFollow
對象時使用 std::shared_ptr<PathFollow>
,而不是使用裸指針。
希望這可以幫助到您!如果您有任何其他問題,請隨時提問。
到此這篇關于C++ 兩個類通過智能指針進行訪問操作的文章就介紹到這了,更多相關C++ 智能指針內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Matlab利用隨機森林(RF)算法實現(xiàn)回歸預測詳解
這篇文章主要為大家詳細介紹了Matlab如何利用隨機森林(RF)算法實現(xiàn)回歸預測,以及自變量重要性排序的操作,感興趣的小伙伴可以了解一下2023-02-02C++實現(xiàn)LeetCode(40.組合之和之二)
這篇文章主要介紹了C++實現(xiàn)LeetCode(40.組合之和之二),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下2021-07-07