Создание шаблонного массива шаблонных массивов различных шаблонных объектов - PullRequest
0 голосов
/ 26 сентября 2019

Эй, сейчас я работаю над очень простым ecs и хочу сохранить все мои Components, из которых есть разные типы, в массивах, также есть разные типы, и все эти массивы в одномбольший массив.Вот так:

ComponentArray< ComponentArray< Component > > components;

Теперь я читал об этом, и, очевидно, мне нужно создать базовый класс для ComponentArray, а также для Component и позволить MainArray иметь указатели на базовый класс.Поэтому я думаю, что объявление должно выглядеть следующим образом:

ComponentArray< ComponentArrayBase< ComponentBase* >* > components;

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

ComponentArray< ComponentArrayBase< ComponentBase* >* > ComponentManager::components{/*creating some arrays here*/};

Мой класс Array выглядит следующим образом:

template<typename ComponentType>
struct ComponentArrayBase{};

template<typename ComponentType>
struct ComponentArray : ComponentArrayBase<ComponentType>
{
    ComponentType array[maxEntitys];

    ComponentType& operator[](unsigned int index)
    {
        return array[index];
    }
};

А мой Components выглядит следующим образом:

struct ComponentBase{};

struct PositionComponent : ComponentBase
{
    //some member variables
};

Где я хочу его использовать, например:

template<typename ComponentType>
ComponentType& ComponentManager::getComponent(Entity e, unsigned char index)
{
    return *(*(components[index])[e]);
}

При компиляции я получаю следующую ошибку:

error: no match for ‘operator*’ (operand type is ‘ComponentArrayBase<ComponentBase*>’)
     return *(*(components[componentArray])[e]);

Другой вопрос заключается в том, что массив хранит только указатели на Components, Components где-то еще.Так что при создании объекта ComponentArray[index][e] = Component(); создаст указатель на объект, который не существует, когда программа выходит из области видимости, верно?Поэтому я должен сделать что-то вроде этого: ComponentArray[index][e] = new Component();, который создает объект в куче, и я должен уничтожить его вручную.Есть ли способ уничтожения объекта при уничтожении указателя?

Я не уверен, что все сказанное мной имеет смысл, поэтому большое спасибо за ваши ответы

Че

...