Class-based actors
A class-based actor is a subtype of event_based_actor and must implement the pure virtual member function make_behavior returning the initial behavior.
原話告訴我們兩點:1.必須繼承“ event_based_actor”。
2.重載make_behavior的函數,其實就是這個類的構造函數,定義了這個初始行為。
關於第一點呢,說明這個類可以使用很多基本的send,看了一點點源碼發現event_based_actor間接繼承了一個叫 localactor 的類,關於這個以類為基礎構造的actor的用法可以去里面找,還是很方便的。
關於第二點,比較簡單,就是要注意,以函數來構造的actor,會傳入參數,但是這個main_behavior是不用參數的。
第二點帶來的問題,就是函數構造的actor發送給自己消息只需要self來只待自己,如
self ->send(self,"hello");
現在不行了,自己就想到一種辦法就是在類內聲明一個scoped_actor,發送給this指針(在本地發送應該是用指針的)。
#include <string> #include <iostream> #include "caf/io/all.hpp" #include "caf/all.hpp" using namespace std; using namespace caf; class SlaveNodeActor : public event_based_actor { public: behavior make_behavior() override { scoped_actor a; a->send(this,"hello"); return { [=](const string& str ) { cout << str << endl; quit(); }, caf::others >> [=]() { cout << "unkown message" << endl; } }; } }; int main(){ auto slave_actor = caf::spawn<SlaveNodeActor>(); caf::await_all_actors_done(); return 0; }
然后,最近寫代碼發現這樣一種用法,就是類A存放這actor的信息如IP,端口號,以及這個actor本身的信息,作為一個人就需要姓名,而類B繼承了event_based_actor,作為類A的友元類去調用A的信息,B的構造函數需要傳入一個類A的指針即可,A負責對外提供接口控制actor的行為。
貼個圖片


為了方便控制,類A(SlaveNode 最好好把actor作為自己的成員變量,不然使用的時候會不方便,用了就知道,你懂得。)
之后又試了一下,其實可以把上面生成scoped_actor 去掉,
直接用

這樣也是可以的,功能都是一樣的。(之前有些粗糙誤導了)
最后弱弱的說一句,求互粉阿!
