初始化静态sf::RenderWindow时出现「Attempting to Reference a deleted function」错误
解决SFML静态RenderWindow初始化时的「Attempting to Reference a deleted function」错误
错误原因
SFML的sf::RenderWindow类禁用了拷贝构造和拷贝赋值操作(相关函数被标记为= delete)。你当前的初始化写法使用了拷贝初始化:
sf::RenderWindow Renderer::window = sf::RenderWindow(sf::VideoMode(1200, 1000), "Proj");
这种写法会先创建临时的RenderWindow对象,再尝试将其拷贝赋值给静态成员window,触发了被删除的拷贝函数,导致编译错误。
修复步骤
- 改用直接初始化,去掉等号,直接构造静态成员:
sf::RenderWindow Renderer::window(sf::VideoMode(1200, 1000), "Proj"); - 移除不必要的
static修饰类:C++中类本身不需要static关键字,删掉static class Renderer里的static,避免作用域问题:class Renderer { public: static sf::RenderWindow window; }; - 删除无用代码:
new Renderer;这句创建了未使用的对象,会造成内存泄漏,直接删除。
修复后的完整代码
#include <iostream> #include <SFML/Graphics.hpp> class Renderer { public: static sf::RenderWindow window; }; sf::RenderWindow Renderer::window(sf::VideoMode(1200, 1000), "Proj"); class Quad { public: sf::Vector2<float> Scale; sf::Vector2<float> Pos; public: Quad(sf::Vector2<float> P, sf::Vector2<float> S) { Pos = P; Scale = S; } sf::RectangleShape RenderMe() { sf::RectangleShape s; s.setScale(Scale); s.setPosition(Pos); return s; } }; int main() { std::cout << "Hello World!\n"; Quad s(sf::Vector2<float>(40,40), sf::Vector2<float>(20,20)); while (Renderer::window.isOpen()) { sf::Event event; while (Renderer::window.pollEvent(event)) { if (event.type == sf::Event::Closed) Renderer::window.close(); } Renderer::window.clear(); Renderer::window.draw(s.RenderMe()); Renderer::window.display(); } return 0; }
内容的提问来源于stack exchange,提问作者KitChaos
相关产品推荐
相关产品推荐

