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è)成員變量,用于存儲(chǔ)傳遞的函數(shù)指針。
- 在接收函數(shù)的類中,定義一個(gè)函數(shù),該函數(shù)使用存儲(chǔ)的函數(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è)成員變量來存儲(chǔ)Nav類的指針。
- 在Follow類中定義一個(gè)函數(shù),通過存儲(chǔ)的指針來調(diào)用Nav類的函數(shù)。
- 在創(chuàng)建Follow類的實(shí)例時(shí),將Nav類的指針傳遞給Follow類的構(gòu)造函數(shù)。
- 在Follow類中通過存儲(chǔ)的指針來調(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) {}
// 使用存儲(chǔ)的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;
}對(duì)于這兩種方法,利弊如下:
- 將函數(shù)作為回調(diào)函數(shù)傳遞:
- 優(yōu)點(diǎn):在調(diào)用函數(shù)時(shí)更加靈活,可以在不同的類之間共享和傳遞函數(shù),可以傳遞不同的函數(shù)給同一個(gè)類的不同成員變量。
- 缺點(diǎn):需要定義函數(shù)指針類型,可能會(huì)增加代碼的復(fù)雜性。
- 將Nav類的指針傳遞給Follow類:
- 優(yōu)點(diǎn):更容易訪問Nav類的成員變量和函數(shù),不需要定義函數(shù)指針類型。
- 缺點(diǎn):在傳遞指針時(shí)需要注意指針的生命周期,可能需要手動(dòng)管理內(nèi)存。
選擇哪種方法取決于您的具體需求和設(shè)計(jì)考慮。如果您需要在不同的類之間共享和傳遞函數(shù),并允許動(dòng)態(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 對(duì)象,并將 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)行操作。
請(qǐng)注意,使用 std::shared_from_this() 的前提是,您必須在創(chuàng)建 PathFollow 對(duì)象時(shí)使用 std::shared_ptr<PathFollow> ,而不是使用裸指針。
希望這可以幫助到您!如果您有任何其他問題,請(qǐng)隨時(shí)提問。
到此這篇關(guān)于C++ 兩個(gè)類通過智能指針進(jìn)行訪問操作的文章就介紹到這了,更多相關(guān)C++ 智能指針內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++編寫實(shí)現(xiàn)飛機(jī)大戰(zhàn)
這篇文章主要為大家詳細(xì)介紹了C++編寫實(shí)現(xiàn)飛機(jī)大戰(zhàn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-06-06
Cocos2d-x UI開發(fā)之文本類使用實(shí)例
這篇文章主要介紹了Cocos2d-x學(xué)習(xí)筆記之文本類,文本類是UI開發(fā)中經(jīng)常使用的,本文用詳細(xì)的代碼注釋講解了文本類的使用,需要的朋友可以參考下2014-09-09
通過C++程序示例理解設(shè)計(jì)模式中的外觀模式
這篇文章主要介紹了通過設(shè)計(jì)模式中的外觀模式及相關(guān)的C++程序示例,外觀模式在高層提供了一個(gè)統(tǒng)一的接口實(shí)現(xiàn)一定程度上的解耦,需要的朋友可以參考下2016-03-03
Matlab利用隨機(jī)森林(RF)算法實(shí)現(xiàn)回歸預(yù)測(cè)詳解
這篇文章主要為大家詳細(xì)介紹了Matlab如何利用隨機(jī)森林(RF)算法實(shí)現(xiàn)回歸預(yù)測(cè),以及自變量重要性排序的操作,感興趣的小伙伴可以了解一下2023-02-02
詳解如何利用C++實(shí)現(xiàn)Mystring類
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)MyString的示例代碼,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-08-08
C語言學(xué)生學(xué)籍管理系統(tǒng)課程設(shè)計(jì)
這篇文章主要介紹了C語言學(xué)生學(xué)籍管理系統(tǒng)課程設(shè)計(jì),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01
C++實(shí)現(xiàn)LeetCode(40.組合之和之二)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(40.組合之和之二),本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07

