Итак, вот что я получил вкратце.

  1. У меня есть базовый класс предметов, от которого происходят зелья, снаряжение, заклинания и т. Д., И несколько классов являются производными от них и т. Д. Примечание: некоторые производные классы имеют не зависящие от виртуального класса функции-члены / типы данных.

  2. Я также создал "случайный" генератор брони / оружия.

Я хочу иметь такой инвентарь:

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 */);

Я не знаю, что с этим делать, потому что, как только эта функция выходит из области видимости, я теряю указатель. И без указателей / ссылок я не могу использовать полиморфизм, который позволяет мне хранить все мое оборудование в одном контейнере.

Я действительно потерялся на этом этапе и ищу любые предложения или альтернативы, которые могут предложить люди. Если вам нужно больше кода, я отправлю его, просто скажите, какие части вас интересуют.

Извините, если я был расплывчатым, это мой первый пост. Обычно я неплохо разбираюсь во всем самостоятельно, но эта штука меня победила. Если кому-то нужна дополнительная информация, спрашивайте, и я постараюсь ее предоставить.

Заранее спасибо, -Райан

2
Ryan Nolan 17 Янв 2013 в 11:39
В чем тут вопрос? Почему бы тебе не добавить это в Equipment_Inventory?
 – 
Karthik T
17 Янв 2013 в 11:40
Не запрашивайте у конкретных видов оружия их свойства, говорите им, что делать, через единый интерфейс. Они могут решить, что им делать.
 – 
Peter Wood
17 Янв 2013 в 11:44
Т: Причина, по которой я не могу добавить его, заключается в том, что как только моя функция генератора брони завершается, мой указатель превращается в мусор. потому что на тот момент это уже выходит за рамки. Верно? Я почти уверен, что именно так работает динамическая память.
 – 
Ryan Nolan
17 Янв 2013 в 11:47
@RyanNolan: Это не совсем так. Указатель находится вне области видимости, но значение (т. Е. Адрес вашего объекта TestArmor) может храниться, пока этот объект жив.
 – 
Michael Foukarakis
17 Янв 2013 в 11:47
Вуд: Это интересный способ решения проблемы. Тот, который я раньше не рассматривал. Я действительно увлекся полиморфизмом. Я посмотрю, что я могу придумать.
 – 
Ryan Nolan
17 Янв 2013 в 11:50

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. Это способ введения полиморфизма, основанного на нескольких типах, а не на одном типе.

2
Peter Wood 17 Янв 2013 в 12:47