0

So I was porting my game engine from SDL to SFML, and now I have a problem with my input system. Input.h


#ifndef BULLWHIP_INPUT_H
#define BULLWHIP_INPUT_H
#include 

class bc_Input
{
    public:
        bool bm_KeyHit(sf::Key::Code key);
        bool bm_KeyDown(sf::Key::Code key);
        int bm_MouseX();
        int bm_MouseY();
        void bm_init(sf::RenderWindow app);
    private:
        sf::RenderWindow App;
        const sf::Input& input;
};

#endif

Input.cpp


#include "Input.h"

bool bc_Input::bm_KeyDown(sf::Key::Code key)
{
    return in.IsKeyDown(key)
}

bool bc_Input::bm_KeyHit(sf::Key::Code key)
{
    sf::Event event;
    while(App.GetEvent(event) && event.Type == sf::Event::KeyPressed)
    {
        switch(event.Key.Code)
        {
            case key: return true; break;
            default:
                break;
        }
    }

}

void bc_Input::bm_init(sf::RenderWindow app)
{
    App = app;
    in = App.GetInput();
}

int bc_Input::bm_MouseX()
{
    return in.GetMouseX();
}

int bc_Input::bm_MouseY()
{
    return in.GetMouseY();
}

I get these errors from this:

C:\c++\sdl\bullwhip\lib\Bullwhip\/Input.h:15: error: 'bc_Input::App' cannot appear in a constant-expression C:\c++\sdl\bullwhip\lib\Bullwhip\/Input.h:15: error: '.' cannot appear in a constant-expression C:\c++\sdl\bullwhip\lib\Bullwhip\/Input.h:15: error: a function call cannot appear in a constant-expression C:\c++\sdl\bullwhip\lib\Bullwhip\/Input.h:15: error: ISO C++ forbids initialization of member 'input' C:\c++\sdl\bullwhip\lib\Bullwhip\/Input.h:15: error: making 'input' static C:\c++\sdl\bullwhip\lib\Bullwhip\/Input.h:15: error: invalid in-class initialization of static data member of non-integral type 'sf::Input&'

c:\program files (x86)\codeblocks\mingw\bin../lib/gcc/mingw32/4.4.0/../../../../include/SFML/System/NonCopyable.hpp:57: error: 'sf::NonCopyable::NonCopyable(const sf::NonCopyable&)' is private c:\program files (x86)\codeblocks\mingw\bin../lib/gcc/mingw32/4.4.0/../../../../include/SFML/Window/Window.hpp:56: error: within this context

Chris
  • 515
  • 1
  • 6
  • 16

1 Answers1

0

You're calling the copy constructor here:

void bc_Input::bm_init(sf::RenderWindow app)
{
    App = app;
    in = App.GetInput();
}

Note one of your error messages:

error: 'sf::NonCopyable::NonCopyable(const sf::NonCopyable&)

In order to avoid this problem, you should use an actual constructor for your sf::Input object along with an initialization list.

Alternatively, if you've already initialized a sf::RenderWindow in a higher subsystem (as is likely the case), simply changing your member variable App to a reference should do the trick.

//header
sf::RenderWindow& App;
...
//source
void bc_Input::bm_init(sf::RenderWindow& app)
{
    App = app;
    in = App.GetInput();
} 
epaik
  • 235
  • 2
  • 5