При вызове shape.setTexture(&tex)
указатель на ваш объект текстуры сохраняется в форме.
Проблема в том, что вы используете std::vector
для управления вашими объектами A. A std::vector
управляет массивом в куче. Но этот массив не является динамическим c, он не может изменить свой размер. Итак, чтобы увеличить свой размер, вектор выделяет совершенно новый массив требуемого размера, копирует элементы из старого массива в новый и удаляет старый массив.
Теперь указатель внутри вашего объекта Shape равен аннулирован, так как он не был обновлен, и теперь он указывает на ячейку памяти, в которой могло быть что угодно.
Веб-сайт https://en.cppreference.com/w/cpp/container/vector показывает в разделе «Недействительность итератора», какие итераторы (какие в основном указатели) становятся недействительными, какими методами при использовании std::vector
.
Это причина, по которой ваши текстуры не работают должным образом.
Чтобы исправить эту проблему, я бы предложил использовать некоторый тип указателя на объект tex
внутри вашего класса A.
Вы можете использовать необработанный указатель, который указывает на объект Texture, который вы создали с помощью new
внутри вашего конструктора. Но не забудьте указать delete
объект в деструкторе.
В качестве альтернативы вы можете использовать std::unique_ptr
или std::shared_ptr
для автоматического управления уничтожением объекта текстуры.
Используя указателя на отдельный объект, аннулирования указателя на объект текстуры можно избежать, поскольку сам объект не перемещается.
В качестве альтернативы вы можете использовать std::list
вместо std::vector
, потому что добавляете объекты в list не делает недействительными указатели на объекты в этом списке.
From https://en.cppreference.com/w/cpp/container/list:
Добавление, удаление и перемещение элементов внутри списка или между несколькими списками не делает недействительными итераторы или ссылки. Итератор становится недействительным только при удалении соответствующего элемента.
Обратной стороной списков является то, что они не обеспечивают произвольный доступ.