2016-07-25 26 views
1

プライベートでC++ SFMLコンパイルエラーSF ::コピー不可::コピー不可(constのSF ::コピー不可&)は

#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 

main.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

この問題を解決するにはどうすればよいですか?

+1

私は失礼したくはありませんが、C++の基礎を正しく学習することから始めます。たとえば、 'new(&app)sf :: RenderWindow(...'は**ここで何をしていないか** – Hiura

答えて

4

SFML tutorialsを読んで、その例のようなプログラムを作成してください。

具体的な問題は、sf::RenderWindowのコピーコンストラクタがプライベートであることです。通常、ウィンドウをコピーするのは意味がありません。

残念ながらstd::vectorSFMLSetを使用しました。ベクトルはサイズを動的に拡張する必要があり、これを実装するために、新しい大きなバッファを割り当て、既存のコンテンツを新しい場所にコピーします。SFMLSetのコピーコンストラクタを呼び出し、次にsf::RenderWindowを呼び出しようとします。

この問題を解決する最善の方法は、おそらくチュートリアルのようにmainにローカル変数としてそのまま残して、sf::RenderWindowをIMGSから削除することです。あなたはおそらく、それぞれの画像に対して新しいウィンドウを開くことを意味しなかったのでしょうか?

+0

'std :: vector'を移動専用の型で使用することはできません'sf :: RenderWindow'の使用に間違いがあることに同意します:' app'はおそらくウィンドウへのスマートポインタでなければなりません – KABoissonneault

+0

sf :: RenderWindowは動かない - C++ 11のサポートはロードマップ上にありますが、まだ実装されていません。 – Dutow

+0

それから動的に割り当てられなければなりません。 – KABoissonneault

2

sf::NonCopyableのインスタンスをどこかにコピーしようとしているというエラーメッセージが表示されます。コンパイラーは、そのクラスのコピーコンストラクターを呼び出そうとしていますが、そのコピーコンストラクターはプライベートに定義されているためアクセスできません。 インスタンスがコピーされる原因を解消し、そのコードをコピーして(おそらくポインタを使用するように)変更する必要があります。

関連する問題