問題:貓和老鼠問題刁绒,貓一叫,老鼠要逃跑
提出了一種對象間的通信機制坊罢,這種機制续担,要能夠給兩個對象間的函數(shù)建立映射關(guān)系。前者被調(diào)用時候活孩,后者能夠自動調(diào)用物遇。
1:回調(diào)函數(shù)+映射表
std::map<std::string,std::function<void()>> callback;
建立映射關(guān)系和調(diào)用功能? 封裝一個connection類? 這個類需要存在于上下文環(huán)境中,可以這樣寫憾儒。
2:觀察者模式 =發(fā)布訂閱模式
引出了信號與槽的機制
3: MOC工具 OOBject宏 展開后是發(fā)現(xiàn)里面聲明了一個只讀的靜態(tài)成員變量staticMetaObject以及三個public成員函數(shù)询兴。 聲明的這些函數(shù)在moc.cpp里面進行了實現(xiàn)。稱為定義起趾。
staticmetaobject是一個結(jié)構(gòu)體诗舰。成員字符串存儲了該對象的信號與槽等元信息。然后截取出來训裆; 存放的時候以數(shù)組形式存放的眶根。
connection成員對象?
映射 反射? 傳入字符串 返回實例。
在 信號miao函數(shù)里面 將直接調(diào)用QMetaObject::activte边琉。去找出當前信號連接的所有的對象-槽函數(shù)属百。
常用元類型已經(jīng)注冊了,自定以的需要進行一個注冊变姨;qregisterMetaType();
x新版本的connect使用了取成員函數(shù)指針的方法族扰,少去了字符串查找過程。
connect過程: 1:參數(shù)校驗判空 2:拿到發(fā)送者元對象3:獲取當前這個對象的信號索引 校驗定欧,3:拿到接收者對象渔呵,并獲取到當前對象的槽索引,4:綁定 connection 被創(chuàng)建了砍鸠,插入到一個隊列了 雙向鏈表+數(shù)組存儲
connectionlists 屬于每個對象扩氢,是一個數(shù)組,按照信號索引
進行存儲睦番;找出當前對象信號連接的所有對象-槽函數(shù)类茂,再逐個處理