Эй, сейчас я работаю над очень простым 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();
, который создает объект в куче, и я должен уничтожить его вручную.Есть ли способ уничтожения объекта при уничтожении указателя?
Я не уверен, что все сказанное мной имеет смысл, поэтому большое спасибо за ваши ответы
Че