我正在開發一個非常小而簡單的C++遊戲引擎。我有一個生物類和一個武器類。生物需要知道它有什麼武器,每個武器需要知道擁有它的生物。我希望武器知道生物具有何種功能的主要原因是爲了防止它破壞它自己的生物(當武器攻擊時,它將檢測它碰撞並殺死它們的所有生物,除了擁有武器的生物)。兩個需要相互引用的對象。餿主意?
這裏是(簡化)生物類的樣子:
class Creature {
private:
Weapon* weapon_;
public:
void SetWeapon(Weapon* w){
// do some other stuff (e.g. remove Weapon from any other Creatures)
weapon_ = w;
w->creature_ = this;
}
}
這裏是(簡化)的武器類的樣子:
class Weapon{
friend class Creature; // Creature needs access to creature_ pointer
private:
creature_;
}
正如你所看到的,我已經生物武器的朋友類,以便Creature的setWeapon()方法可以適當地設置私人生物_指針。
我的具體問題:
我聽說兩個對象引用對方是糟糕的設計。但就我而言,我怎麼會不這樣做呢?我真的「感覺到」每個生物都應該知道它有什麼武器,每個武器都應該知道生物具有什麼(以便它不會傷害生物)。有沒有什麼方法可以實現我想要的,而不需要讓這兩個類互相引用?我在Map/Entity,Inventory/Item等遊戲引擎中一次又一次地遇到了這個SAME問題。似乎每當我有一個「Container」類和一個「Item」類時,這個引用問題就會重新出現。我想把這個項目加入到其中一個類中,但我希望兩個類彼此知道(即我想讓生物知道它的武器和武器知道它的生物)。沒有任何方法可以實現這一點,而不需要兩個項目相互引用?
這種設計有時是必需的嗎?還是有一種通用的方式來總是避免它,但實現相同類型的功能?
如果這種設計對於實現這種功能來說確實是必要的,那麼使用朋友類是否有正確的方法來處理它?
非常感謝你提前。我非常有興趣學習如果有一種方法可以實現這種類型的功能,而不需要對象彼此引用。
你有沒有考慮讓這個生物進攻而不是武器?然後,你可以擁有攻擊()方法,因爲該生物擁有武器並且該生物知道自己,所以該武器和生物都知道。 – Knox
@Knox我的確在想這個,但是我希望攻擊行爲在於武器而不是生物。當一個生物被告知攻擊()時,它應該簡單地委託給weapon_.attack()。這將允許生物動態交換武器。 – MeLikeyCode
然後或許讓生物的attack()方法調用武器的_attack(實體),這樣你可以爲武器範圍內的每個實體(不包括它本身)調用_attack()。 – Knox