Re: [問題] 指定class中的成員函數
※ 引述《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
推
01/20 16:58, , 1F
01/20 16:58, 1F
→
01/20 17:00, , 2F
01/20 17:00, 2F
→
01/20 17:04, , 3F
01/20 17:04, 3F
→
01/20 17:04, , 4F
01/20 17:04, 4F
→
01/20 17:06, , 5F
01/20 17:06, 5F
推
01/20 17:12, , 6F
01/20 17:12, 6F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 3 之 3 篇):