Полиморфизм при работе с TGUI

317
21 января 2017, 11:54

В классе SelectLevel существует функция drawLevels(tgui::Gui& gui, sf::RenderWindow& window, string name), которая принимает указатель на окно и окно виджетов для библиотек SFML и TGUI соответственно.

void SelectLevel::drawLevels(tgui::Gui& gui, sf::RenderWindow& window, string name)
{
    tgui::Label::Ptr levelTitle = std::make_shared<tgui::Label>();
    levelTitle->setPosition(135, 92);
    levelTitle->setTextSize(22);
    levelTitle->setText(name);
    gui.add(levelTitle);
}

Суть в том, что есть цикл:

SelelctLevel Level;    
for (int i = 0; levelNameVector.size() > i; i++)
{
Level.drawLevels(gui, window, levelNameVector[i]);
}

Мне нужно применить функцию drawLevels, но при этом необходимо, чтобы название экземпляра, которая идёт после объявления типа tgui::Label::Ptr в функции drawLevels менялось в зависимости от номера итерации или хотя бы было уникальным. Как можно это реализовать?

Answer 1

Имя переменной тут вообще роли не играет, насколько можно заметить, если она объявлена внутри функции то она просуществует только до конца выполнения функции. Но т.к. она "shared" и добавлена в gui то в памяти останется, но без имени.

Если нужно будет получить доступ к этому лейблу, то нужно будет указать ему имя, и сделать его уникальным. https://tgui.eu/documentation/0.8/classtgui_1_1Gui.html#aa5148777e159aed6d08dca0602cf79da

void tgui::Gui::add ( const Widget::Ptr &  widgetPtr, const sf::String &  widgetName = "" ) 

Это не имя переменной, а имя виджета - строка. Далее можно получить доступ, передавая имя в функцию get. https://tgui.eu/documentation/0.8/classtgui_1_1Gui.html#a820f590c4cfbc9cc59a84ab51f0dff63

gui.add(levelTitle, "my_label1");
tgui::Label::Ptr levelTitle = gui.get("my_label1");

В итоге финальная функция выглядит так:

void SelectLevel::drawLevels(tgui::Gui& gui, sf::RenderWindow& window, int i, string name)
{
    tgui::Label::Ptr levelTitle = std::make_shared<tgui::Label>();
    levelTitle->setPosition(135, 92);
    levelTitle->setTextSize(22);
    levelTitle->setText(name);
    gui.add(levelTitle, "levelLabel" + i);
}
for (int i = 0; levelNameVector.size() > i; i++)
{
    drawLevel[i]->drawLevels(gui, window, i, levelNameVector[i]);
}
READ ALSO
Qt C++ парсинг XML файлов. Что выбрать?

Qt C++ парсинг XML файлов. Что выбрать?

В Qt с XML файлами можно работать по разномуНапример с помощью DOM, SAX, QXmlStream(Reader-Writer)

486
Сообщение ответ клиенту с помощью winsock2?

Сообщение ответ клиенту с помощью winsock2?

Как отправить сообщение клиенту средствами winsock2? Пример отправляю сообщение на сервер, и нужно что-бы сервер ответил, принял ли message? Как реализовать...

343
Задача на нахождение в числе подчисла 33 [требует правки]

Задача на нахождение в числе подчисла 33 [требует правки]

Не получается сделать задачу на C++

352
Почему присваивается мусор?

Почему присваивается мусор?

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

453