У меня есть класс верхнего уровня под названием Component, от которого я наследую несколько «компонентов».
В другом объекте класса у меня есть вектор типа Component, содержащий все компоненты, добавленные к этой сущности. Точно так же у меня есть шаблонная функция:
template <typename T, typename... TArgs> T& AddComponent(TArgs&&... mArgs)
{
T* c(new T(std::forward<TArgs>(mArgs)...));
c->entity = this;
std::unique_ptr<Component> uPtr{ c };
components.emplace_back(std::move(uPtr));
componentArray[getComponentTypeID<T>()] = c;
componentBitSet[getComponentTypeID<T>()] = true;
c->Init();
return *c;
}
Важным битом здесь является c -> Init ();
Поэтому, когда добавляется новый компонент, он вызывает Init () на всех унаследованных компонентах, если они предоставили определение переопределения для Init ().
Затем у меня есть класс с именем Me sh, который наследуется от компонента. Соответствующий метод для этого вопроса:
void Mesh::Init(const IndexedModel& model)
{
glGenVertexArrays(1, &m_vertexArrayObject);
glBindVertexArray(m_vertexArrayObject);
glGenBuffers(NUM_BUFFERS, m_vertexArrayBuffers);
glBindBuffer(GL_ARRAY_BUFFER, m_vertexArrayBuffers[position_VB]);
glBufferData(GL_ARRAY_BUFFER, model.positions.size() * sizeof(model.positions[0]), &model.positions, GL_STATIC_DRAW);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);
glBindVertexArray(0);
}
Это выдает "функция не принимает 0 аргументов", особенно в строке, содержащей "c -> Init ();" в шаблонной функции Entity AddComponent.
Чтобы подтвердить, что это переопределение унаследованной функции "Init ()", моя реализация заголовка Me sh выглядит следующим образом:
Entity *entity = Component::entity;
//Mesh(Vertex* verts, unsigned int numVerts);
Mesh(const std::string& fileName);
virtual void Init(const IndexedModel& model);
virtual void Draw();
virtual ~Mesh();
}
I Я предполагаю, что это потому, что Init, который я определяю в файле me sh, имеет один аргумент типа IndexedModel, в то время как Init в компоненте принимает 0 аргументов. Если это так, есть ли способ вызвать эту функцию в методе инициализации объекта и все же передать аргумент в метод инициализации me sh?
спасибо!