Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
1 / 1 / 0
Регистрация: 10.05.2022
Сообщений: 4

Потеря параметров конструктора

05.02.2023, 19:53. Показов 977. Ответов 1

Студворк — интернет-сервис помощи студентам
В общем, есть 2 класса-наследника от класса Window : WinMainMenu и WinGame.
Проблема в том, что раз в N количество запусков программы при переходе в окно WinGame, то есть вызове метода WinMainMenu::BtnNewGame его параметры обнуляются и соответственно программа крашится на конструкторе для bg_image. Если убрать bg_image, то краш при windows.push_back(std::move(winGame));

Вывод консоли, когда все норм такой

WinMainMenu ren = 0000028A263E18C8
WinMainMenu resources = 0000028A2633C790
WinGame ren = 0000028A263E18C8
WinGame resources = 0000028A2633C790
WinMainMenu winGame created

А когда не норм такой

WinMainMenu ren = 0000028A263E18C8
WinMainMenu resources = 0000028A2633C790
WinGame ren = 0000000000000000
WinGame resources = 0000000000000000

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Window
{
public:
    Window(SDL_Renderer* ren, float scale, std::vector<std::unique_ptr<Window>>& windows, Resources* resources) : ren(ren), scale(scale),
        windows(windows), resources(resources)  {};
    virtual ~Window() = 0 {};
 
    virtual void handleEvents() = 0;
    virtual void render() = 0;
 
protected:
    std::vector<std::unique_ptr<Window>>& windows;
    Resources* resources;
    SDL_Renderer* ren;
    float scale;
};
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class WinMainMenu : public Window
{
public:
    WinMainMenu(SDL_Renderer* ren, float scale, std::vector<std::unique_ptr<Window>>& windows, Resources* resources);
    ~WinMainMenu() override;
 
    void handleEvents() override;
    void render() override;
 
private:
    std::vector<std::unique_ptr<Button>> buttons;
 
    void BtnNewGame();
    void BtnLoadGame();
    void BtnSettings();
    void BtnExit();
};
C++
1
2
3
4
5
6
7
8
9
10
11
class WinGame : public Window
{
public:
    WinGame(SDL_Renderer* ren, float scale, std::vector<std::unique_ptr<Window>>& windows, Resources* resources);
    ~WinGame() override;
    
    void handleEvents() override;
    void render() override;
private:
    std::vector<std::unique_ptr<Image>> images;
};
C++
1
2
3
4
5
6
7
8
9
void WinMainMenu::BtnNewGame()
{
    windows.clear();
    std::cout << "WinMainMenu ren = " << ren << std::endl;
    std::cout << "WinMainMenu resources = " << resources << std::endl;
    std::unique_ptr<WinGame>winGame(new WinGame(ren, scale, windows, resources));
    std::cout << "WinMainMenu winGame created" << std::endl;
    windows.push_back(std::move(winGame));
}
C++
1
2
3
4
5
6
7
8
WinGame::WinGame(SDL_Renderer* ren, float scale, std::vector<std::unique_ptr<Window>>& windows, Resources* resources) : 
    Window(ren, scale, windows, resources) 
{
    std::cout << "WinGame ren = " << ren << std::endl;
    std::cout << "WinGame resources = " << resources << std::endl;
    std::unique_ptr<Image>bg_image(new Image(ren, resources->gui_textures["background2"].texture, resources->gui_textures["background2"].dstrect, 1.0f));
    images.push_back(std::move(bg_image));
};
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
05.02.2023, 19:53
Ответы с готовыми решениями:

Проверка входных параметров конструктора
Всем привет! Как правильно выходить из конструктора если какой либо входной параметр имеет не корректное значение? Можно просто...

Отсутствие в синтаксисе конструктора формальных параметров
Добрый вечер всем. VS 2012 ругается по поводу 46-й строчки,что mpe a выражение должно иметь тип класса, также ошибка в 18 строке...

Проверка правильности входных параметров конструктора
Как проверить допустимость передаваемых входных параметров конструктора класса? Точнее, проверку параметров конечно, можно сделать в теле...

1
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
05.02.2023, 22:52
Лучший ответ Сообщение было отмечено Broder как решение

Решение

Цитата Сообщение от Broder Посмотреть сообщение
windows.clear();
А объект WinMainMenu, в методе BtnNewGame которого это вызывется, случайно не находится ли в векторе windows?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
05.02.2023, 22:52
Помогаю со студенческими работами здесь

Изменение параметров конструктора без аргументов
Как в конструкторе без параметров изменить значения из функции main?

Добавление параметров конструктора в фабричном методе
Доброго времени! Изучаю паттерн фабрика написал на простом примере фигуры и вроде всё хорошо но как мне допустим задавать при создании...

Имена параметров конструктора совпадают с именами членов класса
Есть код #include&lt;iostream&gt; #include&lt;string&gt; using namespace std; class Ball { public: Ball()

Инициализация с помощью конструктора без параметров. Почему не нужны скобки?
Доброго времени суток форумчане. Такой вопрос , почему в конструкторе без параметров не нужно ставить пустых скобочек? вот пример, делаю...

Как избежать повтора параметров конструктора класса-родителя в конструкторе наследника?
С каждым новым наследуемом классом, число параметров конструктора увеличивается. class A { public: A(int a, float b, double c) ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru