作者legnaleurc (CA)
看板C_and_CPP
標題Re: [問題] 指定class中的成員函數
時間Thu Jan 20 16:46:43 2011
※ 引述《loveme00835 (最愛朴素妍)》之銘言:
: 另外推文中 legnaleurc 大的方法, 我想實作起來應該像這樣:
: http://codepad.org/3aA7eVmi
我想我一定是太閒了, 但其實 functor 可以有更自由, 呃, 瘋狂地自由度:
https://gist.github.com/619053
這裡只展示攻擊函式的定義 ... 誰說它一定得是角色的附屬品呢?
因此我把它定義在外面:
typedef void AttackFunction( Character & );
typedef std::function< AttackFunction > AttackFunctor;
然後我們的角色會有一個制式的攻擊動作:
void Character::attack( Character & target ) {
this->attack_( target );
// AttackFunctor Character::attack_
}
呃, 好了, 現在只要是符合 void ( Character & ) 這個簽名的
**任何可呼叫體**
都可以丟進去, 上例中
fistAttack 是一個普通的函式, 被當成函式指標丟進去
MeleeWeapon 生成一個可呼叫的物件, 被當成 functor 丟進去
Bow 是一個繼承自 Missile 的多型類別, 它的虛擬成員函式被
std::bind 合成之後, 一樣當成 functor 丟進去
(注意 std::bind 直接吃 pointer to member function 和 std::shared_ptr,
它不需要額外的轉換, 噢, 我提取的還是父類別的指標, 但它依然展現了多型)
這暗示了什麼? 只要你提供的動作可以接受一個 Character & 並回傳值是 void
它甚至不需要來自同一個繼承體系, 不管它多詭異, 只要你用 std::bind 組得起來,
你就可以合法地運用它
這很大的抽離了繼承帶來的相依性, 也算是 Strategy pattern 的本意:
它其實不在意你有沒有繼承體系, 只要你在不同的 context 中可以使用
不同策略, 就是策略模式
--
自High筆記(半荒廢)
http://legnaleurc.blogspot.com/
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 112.104.125.67
推 loveme00835:推一個 :) 我有想到您可能是指這個方法 XD 01/20 16:58
→ loveme00835:不過考量到 friend 的問題... @_@ 01/20 17:00
→ legnaleurc:friend 就要看封裝的方式啦 ... 我是認為不會造成太大 01/20 17:04
→ legnaleurc:問題, 就算是繼承, 擴充時還是要 protected, 甚至是 01/20 17:04
→ legnaleurc:public ... 什麼都包成 private 會很難再擴充 01/20 17:06
推 loveme00835:嗯嗯 01/20 17:12