我正在制作一个带有窗口功能的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));
}
}
Main.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;
}
答案 0 :(得分:3)
这是一个复制操作,即使您可能打算进行初始化:
GameWindow = sf::RenderWindow(sf::VideoMode( getWindowWidth(), getWindowHeight() ), "Title Goes Here");
并且(如果不明显)sf::RenderWindow
是不可复制的。
您可以在GAME
类的构造函数中通过其构造函数初始化RenderWindow,也可以将其设置为动态对象:
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.
使用它。
答案 1 :(得分:0)
&#34;未初始化的本地变量&#39;事件&#39; vs 2013&#34;在以下比赛中
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)