Я разрабатываю очень маленький и простой игровой движок в 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_;
}
Как вы можете видеть, я сделал Создайте класс друзей класса Weapon, чтобы метод setWeapon() Существа мог правильно установить указатель частного существа_.
Моих конкретные вопросы:
Я слышал, что два объекта привязка друг к другу плохой дизайн. Но в моем случае, как бы я этого не делал? Я действительно «чувствую», что каждое Существо должно знать, какое Оружие оно имеет, и каждое Оружие должно знать, что есть у этого существа (чтобы оно не повредило это Существо). Есть ли способ достичь того, чего я хочу БЕЗ, если эти два класса свяжутся друг с другом? Я столкнулся с этой ОДНОЙ проблемой снова и снова в своем игровом движке с помощью Map/Entity, Inventory/Item и т. Д. Кажется, что всякий раз, когда у меня есть класс «Container» и класс «Item», эта проблема ссылок снова появляется. Я хочу возложить ответственность за добавление элемента только в ОДИН из классов, но я хочу, чтобы классы BOTH знали друг о друге (т. Е. Я хочу, чтобы Существо узнало свое Оружие и Оружие, чтобы знать его Существо). Есть ли способ достичь этого, если оба пункта ссылаются друг на друга?
Этот дизайн иногда необходим? Или существует общий способ всегда избегать этого, но достичь того же типа функциональности?
Если этот проект действительно необходим для достижения такого типа функциональности, использует класс друга надлежащим образом для его обработки?
Большое вам спасибо. Мне очень интересно узнать, есть ли способ достичь такого типа функциональности, не связывая объекты друг с другом.
Вы считаете, что существа атакуют вместо оружия? Тогда у вас может быть метод attack(), который знает об оружии и существе, поскольку у существа есть оружие, и существо знает о себе. – Knox
@Knox Я подумал об этом, однако я хочу, чтобы поведение атаки лежало в оружии, а не в существе. Когда существу говорят атаковать(), он должен просто делегировать оружие_.attack(). Это позволило бы существу динамически менять оружие. – MeLikeyCode
Тогда, возможно, метод attack() метода существа вызовет _attack оружия (Entity), таким образом вы можете вызвать _attack() для каждого объекта в пределах диапазона оружия (исключая себя). – Knox