Проблема с обнулением переменной

Делаю игру на SFML / C++ и возникла проблема: переменная position сама произвольно обнуляется, когда доходит до метода update (вызывается каждый кадр) При этом, если поместить переменную position в .h файл, то все заработает как и задумано. Вот код с небольшими комментариями: .h файл игрока

#pragma once
#include "SFML/Graphics.hpp"
class Player
{
private:

public:
    Player();
    ~Player();

    void initVariables();
    void initShape();

    void update();
    void onEventPoll(const sf::Event& ev);
    void render(sf::RenderTarget* target);

    void setPosition(sf::Vector2f value);
    sf::Vector2f getPosition();
private:
    const float MOVE_SPEED = 1.f;
};

.cpp файл игрока:

#include "Player.h"
#include <iostream> // для дебага 
sf::RectangleShape* shape;
sf::Color playerColor;
sf::Vector2f position;

#pragma region staticF
Player::~Player()
{
    delete shape;
}

void Player::render(sf::RenderTarget* target)
{
    target->draw(*shape);
}
void Player::setPosition(sf::Vector2f value)
{
    position = value;
}

sf::Vector2f Player::getPosition()
{
    return position;
}
#pragma endregion

Player::Player()
{
    initVariables();
    initShape();
}

void Player::initShape()
{
    std::cout << position.x << " " << position.y << std::endl;
    shape->setSize(sf::Vector2f(100.f, 100.f));
    shape->setFillColor(playerColor);
    shape->setPosition(position);
    // тут position ещё равна 500.f, 500.f
}

void Player::update()
{
    // тут poisition равна 0.f, 0.f (дефолтному конструктору)
    std::cout << position.x << " " << position.y << std::endl;
    shape->setPosition(position);
    
}

void Player::onEventPoll(const sf::Event& ev)
{
    
}


void Player::initVariables()
{
    position = sf::Vector2f(500.f, 500.f);
    shape = new sf::RectangleShape();
    playerColor = sf::Color(255, 91, 0, 255);
} 

файл игрового цикла .cpp, если нужен:

#include "GameLoop.h"
#include "InputData.h"
#include "Player.h"

#include <vector>
#include <iostream>

sf::RenderWindow* window;
sf::VideoMode videoMode;
sf::Event ev;
Player player;

InputData input;

GameLoop::GameLoop()
{
    initWindow();
    initVariables();
}

GameLoop::~GameLoop()
{
    delete window;
}

void GameLoop::initWindow()
{
    videoMode = sf::VideoMode(800, 600);
    window = new sf::RenderWindow(videoMode, "Application", sf::Style::Close);
}

void GameLoop::initVariables()
{
    // init variables
}

bool GameLoop::isRunning()
{
    return window->isOpen();
}

const sf::Event& GameLoop::get_event()
{
    return ev;
}

void GameLoop::render()
{
    window->clear();

    player.render(window);

    window->display();
}

void GameLoop::pollEvents()
{
    while (window->pollEvent(ev)) 
    {
        if (ev.type == sf::Event::Closed || input.k_button_pressed(ev, sf::Keyboard::Escape)) 
        {
            window->close();
        }

        player.onEventPoll(ev);
    }
}

void GameLoop::update()
{
    player.update();
}

Ответы (1 шт):

Автор решения: user7860670

В этом примере initShape вызывается из конструктора глобального объекта player из единицы трансляции игрового цикла, при этом меняет значения глобального объекта position из единицы трансляции игрока. Получаете классический Static Initialization Order Fiasco. Избавляетесь ото всех глобальных переменных, проводите инициализацию в конструкторе.

→ Ссылка