SFML выдает некопируемую ошибку при инициализации окна через класс

Я создаю класс Game с функцией, которая создает окно. Когда я пытаюсь выполнить функцию, VS 2012 выдает мне эту ошибку:

Error   1   error C2248: 'sf::NonCopyable::operator =' : cannot access private member declared in class 'sf::NonCopyable'   C:\SFML-2.0-rc\include\SFML\Window\Window.hpp   476 1   Faceman

Вот мой Game.h (незаконченный):

#ifndef FP_MENU
#define FP_MENU

#include <SFML/Graphics.hpp>

class GAME {
    public:

        sf::RenderWindow GameWindow;

        void createWindow();
            unsigned int getWindowWidth();
            unsigned int getWindowHeight();

            void setWindowWidth(unsigned int w);
            void setWindowHeight(unsigned int h);

        void loadMMenu();

        void startGame( bool isTurboMode );
            void pause();

        void options();
            void changeWindowSize( unsigned int x, unsigned int y );
            void changeVolume( int i );

        void Quit();

    private:
        unsigned int WINDOW_WIDTH;
        unsigned int WINDOW_HEIGHT;
};

static GAME Game;

#endif

Game.cpp (недоделанный, но есть все необходимые для тестирования функции):

#include "Game.h"

void GAME::setWindowWidth(unsigned int w) {

    w = WINDOW_WIDTH;
}

void GAME::setWindowHeight(unsigned int h) {

    h = WINDOW_HEIGHT;
}

unsigned int GAME::getWindowHeight() {

    return WINDOW_HEIGHT;
}

unsigned int GAME::getWindowWidth() {

    return WINDOW_WIDTH;
}

void GAME::createWindow() {

    if(getWindowHeight() != 0 && getWindowWidth() != 0)
    {
        GameWindow = sf::RenderWindow(sf::VideoMode( getWindowWidth(), getWindowHeight() ), "Title Goes Here");
        GameWindow.setPosition(sf::Vector2i(50, 50));
    }

    else 
    {
        setWindowWidth(1024);
        setWindowHeight(768);
        GameWindow = sf::RenderWindow(sf::VideoMode( getWindowWidth(), getWindowHeight() ), "Title Goes Here");
        GameWindow.setPosition(sf::Vector2i(50, 50));
    }
}

Основной.cpp:

#include <SFML/Graphics.hpp>
#include "Game.h"

int main()
{
    Game.createWindow(Game.getWindowWidth(), Game.getWindowHeight());

    while (Game.GameWindow.isOpen())
    {
        sf::Event event;
        while (Game.GameWindow.pollEvent(event))
        {
            if (event.type == sf::Event::Closed)
                Game.GameWindow.close();
        }

        Game.GameWindow.clear();
        Game.GameWindow.display();
    }

    return 0;
}

person Tetramputechture    schedule 04.01.2013    source источник
comment
Я предполагаю, что вы должны использовать указатель.   -  person chris    schedule 04.01.2013
comment
Это то, что было в глубине моего сознания, но как?   -  person Tetramputechture    schedule 04.01.2013
comment
предположим, что Game game; в main.cpp вместо static GAME Game; в Game.h?   -  person billz    schedule 04.01.2013


Ответы (2)


Это операция копирования, хотя вы, вероятно, предполагали, что это будет инициализация:

GameWindow = sf::RenderWindow(sf::VideoMode( getWindowWidth(), getWindowHeight() ), "Title Goes Here");

И (если это не очевидно) sf::RenderWindow не копируется.

Вместо этого вы можете инициализировать RenderWindow через его конструктор в конструкторе вашего класса GAME или сделать его динамическим объектом:

std::unique_ptr<sf::RenderWindow> GameWindow; //you are using VS2012 so C++11 smart pointers are the best way to do this

//...skipped some code
GameWindow = std::unique_ptr<sf::RenderWindow>(new sf::RenderWindow(sf::VideoMode( getWindowWidth(), getWindowHeight() ), "Title Goes Here"));

а затем использовать его через GameWindow-> , а не GameWindow. .

person Andrei Tita    schedule 04.01.2013
comment
Или вы можете вызвать функцию-член create, которая принимает те же параметры, что и у конструктора. - person Benjamin Lindley; 04.01.2013
comment
@BenjaminLindley ... тебе просто нужно было пойти и все испортить :D - person Andrei Tita; 04.01.2013
comment
Вау спасибо чувак! Это сработало! Теперь мне нужно найти способ инициализировать значения разрешения, ха-ха... Попробую сам - person Tetramputechture; 04.01.2013
comment
Э... что? Я не понимаю. - person Tetramputechture; 04.01.2013
comment
@Tetramputechture Вы можете просто использовать GameWindow.create(sf::VideoMode( getWindowWidth(), getWindowHeight() ), "Title Goes Here"); вместо того, чтобы менять что-либо еще. Я не знал о методе create, поэтому придумал что-то посложнее. - person Andrei Tita; 04.01.2013
comment
Это тоже работает. Спасибо за помощь, другого выхода я бы и не придумал. Хотел бы я быть таким же умным, как ты :D - person Tetramputechture; 04.01.2013

как насчет "неинициализированная локальная переменная "событие" по сравнению с 2013" в следующем конкурсе

while (window.isOpen()){
            sf::Event event;
            while (event.type)
            {
                if (event.type == sf::Event::Closed)
                    window.close();
                //case haddle all other case
                switch (event.type)
person user110036    schedule 05.11.2014