首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++ SFML编译错误sf::NonCopyable::NonCopyable(const::NonCopyable&)是私有的

C++ SFML编译错误sf::NonCopyable::NonCopyable(const::NonCopyable&)是私有的
EN

Stack Overflow用户
提问于 2016-07-25 12:25:22
回答 2查看 410关注 0票数 1

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

SFMLSet.cpp:

代码语言:javascript
复制
#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:

代码语言:javascript
复制
#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

main.cpp:

代码语言:javascript
复制
#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:错误:'sf::NonCopyable::NonCopyable(const::NonCopyable&)‘是私有的 SFML-2.3.2\include/SFML/Window/Window.hpp:57:23:错误:在此上下文中 SFML-2.3.2\include/SFML/System/NonCopyable.hpp:67:5:错误:'sf::NonCopyable::NonCopyable(const::NonCopyable&)‘是私有的 SFML-2.3.2\include/SFML/Graphics/RenderTarget.hpp:51:25:错误:在此上下文中 SFML-2.3.2\include/SFML/System/NonCopyable.hpp:79:18:错误:'sf::NonCopyable& sf::NonCopyable::operator=(const::NonCopyable&)‘是私有的 SFML-2.3.2\include/SFML/Window/Window.hpp:57:23:错误:在此上下文中 SFML-2.3.2\include/SFML/System/NonCopyable.hpp:79:18:错误:'sf::NonCopyable& sf::NonCopyable::operator=(const::NonCopyable&)‘是私有的 SFML-2.3.2\include/SFML/Graphics/RenderTarget.hpp:51:25:错误:在此上下文中

如何解决这个问题?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-07-25 12:43:49

您应该阅读SFML教程,并编写类似其示例的程序。

这里的具体问题是,sf::RenderWindow的复制构造函数是私有的--通常复制窗口是没有意义的。

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

解决这一问题的最佳方法可能是从sf::RenderWindow中删除main,并将其作为局部变量保存在main中,就像教程中的那样。你可能不是有意为每一张图片打开一个新窗口,对吗?

票数 4
EN

Stack Overflow用户

发布于 2016-07-25 12:42:56

该错误消息告诉您,您正试图在某个地方复制sf::NonCopyable的实例。编译器表示您正在尝试调用该类的复制构造函数,但是该复制构造函数是私有定义的,因此不能被访问。

要修复它,您需要找出导致复制sc::NonCopyable实例的原因,并更改代码,这样就没有副本(可能使用指针)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38567732

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档