2013-10-15 4 views
1

Я работаю над игрой/симуляцией и занимаюсь управлением всеми существами в игре. Существует одно базовое Существо, из которого наследуют различные виды существ.Наследование пулов статических объектов и конструкторов?

В ранних версиях этого кода, где я использовал базовый класс сам по себе в качестве общего для любого данного существа, у меня был частный статический вектор, который хранит телефонную книгу, если вы хотите, чтобы все существа, существующие в игра. Это было обработано конструктором Существа, добавив адрес нового существа в стек. Достаточно просто.

Где я получаю ментальный блок, когда я ввожу наследование. Если я приступю к адаптации класса существа к базовому классу (переместите вектор в защищенный статус, я бы представил?), А оттуда определите некоторые произвольные дочерние классы Monkey, Bear и Tiger ... Когда я создаю экземпляр класс, который наследуется от Существа, не будет ли он добавлен к вектору указателя в родительском классе Существо? Возможно, более прямо, создает ли экземпляр одного из этих дочерних классов конструктор родительского класса?

Я нахожусь на правильном пути мысли или что мне нужно сделать для достижения такого поведения? При необходимости я могу предоставить более подробную информацию.

Спасибо.

-

Моя идея делать вещи таким образом, для одного примера графики. Таким образом, я могу цикл через все существо, которые существуют, и с помощью функции полиморфизма вызовов на каждом из существ, которые возвращают их спрайты, XY местоположение и т.д.

+0

В нуждающемся в фабричной модели? http://sourcemaking.com/design_patterns/abstract_factory/cpp/1 – Arunmu

ответ

1

Это, безусловно, работает, до тех пор, как ваш вектор хранение указатели Creature* и не Creature внутри вашего std::vector. В противном случае object slicing имел бы место, так как вектор резервирует пространство для всего Творения и каждую дополнительной функции подклассов отбрасывается

Что касается стеки вызова конструкторы он довольно прост:

class A { 
    private: 
    int aField; 
    public: 
    A(int aField) : aField(aField) { } 
}; 

class B : public A { 
    private: 
    int bField; 
    public: 
    B(int aField, int bField) : A(aField), bField(bField) { } 
}; 
+0

Да! Я вызываю его в Существо как вектор creatureStack ;, массив указателей на Существа. Большое спасибо. Я обязательно сохраню копию этого кода для справки. :) – user2717676

+0

Имейте в виду, что если вам нужно управлять множеством распределений и освобождением от экземпляров 'Creature', тогда пользовательский пул памяти может быть полезен, чтобы избежать фрагментации кучи. Вам придется решить тот факт, что подклассы имеют разные размеры, но есть много, если вы просматриваете через Интернет. – Jack

Смежные вопросы