Вызовите перегруженную функцию из каждого объекта в std :: vector - PullRequest
0 голосов
/ 04 июля 2019

Я работаю над собственной системой меню в OpenGL.Я хочу, чтобы все мои объекты, связанные с меню, были в одном векторе, поэтому я мог бы просто зациклить их все так:

for (auto i : menuObjects)
{
    i.checkInputs();
    i.draw();
}

Я пробовал с другими методами зацикливания, даже имеяthis->draw(); внутри функции базового класса, но это, очевидно, закончилось бесконечным циклом.

Мой базовый класс в основном такой:

class menuObject
{
public:

    virtual void draw() { }
    virtual void checkInputs() { }

};

А унаследованные классы такие:

class Button : public menuObject
{
public: 
    void draw()
    {
        ... drawing here ...
    }

    void checkInputs()
    {
        ... checking inputs here ...
    }

};

А вот как я могу сохранить их в своем векторе:

std::vector<menuObject> menuObjects = {
    Button(... parameters here ...)
};

Он никогда не переходит к перегруженной функции.Я бы предпочел не иметь каждый отдельный объект меню в своем собственном векторе.Есть идеи?<3 </p>

1 Ответ

3 голосов
/ 04 июля 2019

Проблема, с которой вы столкнулись, заключается в том, что вы не можете хранить объекты разных типов непосредственно внутри вектора.

std::vector<menuObject> menuObjects = {
Button(... parameters here ...)
};

Приведенный выше код разрезает Button в menuObject.Разрезание объектов происходит, когда производному классу присваивается значение базовому классу.Любая информация, связанная с производным классом, теряется.

Что вы хотите сделать, это использовать указатели для учета полиморфизма.

Таким образом, ваш std::vector<menuObjects> станет либо std::vector<menuObjects*>, либо vector<std::unique_ptr<menuObjects>.Используйте последний, если этот вектор будет отвечать за управление временем жизни menuObjects, а первый - если нет.

Примечание: если вы используете первый вариант (т.е. необработанные указатели), убедитесь, что удаление аннулированоуказатели на вектор, когда время жизни menuObject заканчивается до того, как заканчивается время жизни вектора.

...