gpt4 book ai didi

C++ SFML 编译错误 sf::NonCopyable::NonCopyable(const sf::NonCopyable&) is private

转载 作者:行者123 更新时间:2023-11-30 00:46:27 24 4
gpt4 key购买 nike

当我尝试编译以下代码时:

SFMLSet.cpp:

#include "SFMLSet.h"

SFMLSet::SFMLSet(string texturePath)
{
if(!texture.loadFromFile(texturePath)) {
exit(1);
}
new (&app) sf::RenderWindow(sf::VideoMode(texture.getSize().x, texture.getSize().y), texturePath, sf::Style::None);
new (&sprite) sf::Sprite(texture);
}

SFMLSet.h:

#ifndef SFMLSET_H
#define SFMLSET_H
#include <SFML/Graphics.hpp>
#include <string>
#include <cmath>
using namespace std;

class SFMLSet {
public:
sf::RenderWindow app;
sf::Texture texture;
sf::Sprite sprite;

sf::Vector2i grabbedOffset;
bool grabbedWindow = false;

SFMLSet (string texturePath);

sf::Event event;
};


#endif // SFMLSET_H

主要.cpp:

#include <windows.h>
#include <vector>
#include <iostream>

#include "SFMLSet.h"


int main()
{
bool isRunning=true;
vector<SFMLSet> IMGS;
IMGS.push_back (SFMLSet ("cb.bmp"));

while (isRunning)
{
for (int i=0;i<IMGS.size();i++) {
while (IMGS[i].app.pollEvent(IMGS[i].event))
{
if (IMGS[i].event.type == sf::Event::Closed) {
IMGS[i].app.close();
isRunning=false;
}
if (IMGS[i].event.type == sf::Event::KeyPressed && IMGS[i].event.key.code == sf::Keyboard::Escape)
{
IMGS[i].app.close();
isRunning=false;
}
else if (IMGS[i].event.type == sf::Event::MouseButtonPressed)
{
if (IMGS[i].event.mouseButton.button == sf::Mouse::Left)
{
IMGS[i].grabbedOffset = IMGS[i].app.getPosition() - sf::Mouse::getPosition();
IMGS[i].grabbedWindow = true;
}
}
else if (IMGS[i].event.type == sf::Event::MouseButtonReleased)
{
if (IMGS[i].event.mouseButton.button == sf::Mouse::Left)
IMGS[i].grabbedWindow = false;
}
else if (IMGS[i].event.type == sf::Event::MouseMoved)
{
if (IMGS[i].grabbedWindow&&(IMGS[i].grabbedOffset.x<-10&&IMGS[i].grabbedOffset.y<-10)&&(IMGS[i].grabbedOffset.x>-(IMGS[i].texture.getSize().x)+10&&IMGS[i].grabbedOffset.y>-(IMGS[i].texture.getSize().y)+10))
IMGS[i].app.setPosition(sf::Mouse::getPosition() + IMGS[i].grabbedOffset);
}
}

IMGS[i].app.clear();

IMGS[i].app.draw(IMGS[i].sprite);

IMGS[i].app.display();
}
}

return EXIT_SUCCESS;
}

我得到了一些错误:

SFML-2.3.2\include/SFML/System/NonCopyable.hpp:67:5: error: 'sf::NonCopyable::NonCopyable(const sf::NonCopyable&)' is private

SFML-2.3.2\include/SFML/Window/Window.hpp:57:23: error: within this context

SFML-2.3.2\include/SFML/System/NonCopyable.hpp:67:5: error: 'sf::NonCopyable::NonCopyable(const sf::NonCopyable&)' is private

SFML-2.3.2\include/SFML/Graphics/RenderTarget.hpp:51:25: error: within this context

SFML-2.3.2\include/SFML/System/NonCopyable.hpp:79:18: error: 'sf::NonCopyable& sf::NonCopyable::operator=(const sf::NonCopyable&)' is private

SFML-2.3.2\include/SFML/Window/Window.hpp:57:23: error: within this context

SFML-2.3.2\include/SFML/System/NonCopyable.hpp:79:18: error: 'sf::NonCopyable& sf::NonCopyable::operator=(const sf::NonCopyable&)' is private

SFML-2.3.2\include/SFML/Graphics/RenderTarget.hpp:51:25: error: within this context

如何解决这个问题?

最佳答案

您应该阅读 SFML tutorials ,并像他们的示例一样编写程序。

这里的具体问题是 sf::RenderWindow 的复制构造函数是私有(private)的——通常复制一个窗口是没有意义的。

不幸的是,您在 std::vector 中使用了 SFMLSet。 vector 必须动态地增加它们的大小,为了实现这一点,它们分配了一个新的更大的缓冲区,并将它们现有的内容复制到新位置——调用 SFMLSet 的复制构造函数,后者又尝试调用sf::RenderWindows.

解决此问题的最佳方法可能是从 IMGS 中删除 sf::RenderWindow,并将其作为局部变量保留在 main 中,同样,就像在教程中一样.您可能不是要为每张图片打开一个新窗口,对吧?

关于C++ SFML 编译错误 sf::NonCopyable::NonCopyable(const sf::NonCopyable&) is private,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38567732/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com