C ++: переопределение унаследованных функций, передача аргументов, ошибка «функция не принимает 0 аргументов» - PullRequest
0 голосов
/ 25 апреля 2020

У меня есть класс верхнего уровня под названием 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?

спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...