Итак, вот что я получил вкратце.
У меня есть базовый класс предметов, от которого происходят зелья, снаряжение, заклинания и т. Д., И несколько классов являются производными от них и т. Д. Примечание: некоторые производные классы имеют не зависящие от виртуального класса функции-члены / типы данных.
Я также создал "случайный" генератор брони / оружия.
Я хочу иметь такой инвентарь:
struct Hero_Inventory
{
std::vector<Spell*> Spell_Inventory;
std::vector<Potion*> Potion_Inventory;
std::vector<Equipment*> Equipment_Inventory;
Hero_Inventory() {}
};
Создание контейнера (инвентаря) для моих заклинаний и зелий было довольно простым делом. Как они будут предопределены. Использование полиморфизма и указателей не будет проблемой
Моя основная проблема - это выяснить, как хранить и использовать (например, получить доступ к определенным функциям-членам класса оружия) мое случайно сгенерированное оружие / броню (которые оба являются производными от Снаряжения).
Я бы хотел, чтобы все мое «Снаряжение» было в одном контейнере.
Я генерирую все свое оборудование с помощью нескольких функций, поэтому, когда я заканчиваю процесс генерации, получаю что-то вроде этого:
Equipment * TestArmor = new Armor(/* Bunch of parameters go here */);
Я не знаю, что с этим делать, потому что, как только эта функция выходит из области видимости, я теряю указатель. И без указателей / ссылок я не могу использовать полиморфизм, который позволяет мне хранить все мое оборудование в одном контейнере.
Я действительно потерялся на этом этапе и ищу любые предложения или альтернативы, которые могут предложить люди. Если вам нужно больше кода, я отправлю его, просто скажите, какие части вас интересуют.
Извините, если я был расплывчатым, это мой первый пост. Обычно я неплохо разбираюсь во всем самостоятельно, но эта штука меня победила. Если кому-то нужна дополнительная информация, спрашивайте, и я постараюсь ее предоставить.
Заранее спасибо, -Райан
1 ответ
Создайте единый интерфейс для управления объектами Equipment
:
class Equipment {
public:
virtual void render(Renderer& renderer) = 0;
virtual void createController(ControllerManager& controllerManager) = 0;
virtual void load(std::istream& input) = 0;
virtual void save(std::ostream& output) = 0;
};
Функция createController
интересна тем, что оборудование может указывать ControllerManager
, как создать что-то, что будет манипулировать его точными значениями.
Если вам нужна функция, которая позволяет взаимодействовать с другими объектами Equipment
, вам, вероятно, понадобится Visitor Pattern
. Это способ введения полиморфизма, основанного на нескольких типах, а не на одном типе.
Похожие вопросы
Новые вопросы
c++
C++ — это язык программирования общего назначения. Изначально он разрабатывался как расширение C и имел аналогичный синтаксис, но теперь это совершенно другой язык. Используйте этот тег для вопросов о коде, который будет скомпилирован с помощью компилятора C++. Используйте тег версии для вопросов, связанных с конкретной стандартной версией [C++11], [C++14], [C++17], [C++20] или [C++23]. и т.д.
Equipment_Inventory
?TestArmor
) может храниться, пока этот объект жив.