2016-07-13 1 views
-1

私はこの問題を3時間は解決しようとしていますが、私は傾けることができません。私はC++を学ぼうとしていますが、私はここで立ち往生しています。私は問題を知らない。私は弾丸オブジェクトで使用するオブジェクトプールを作成しようとしていたので、メモリリークを起こさずに簡単に生成し、生成することができました。次のように私のソースである:SFML C++の共用体コンストラクタは、デフォルトの定義が不正に作成されるため暗黙的に削除されます

main.cppに

--the最初のエラーは、ブレット・クラスのコンストラクタとBulletPoolクラスの更新方法です。

#include <SFML/Graphics.hpp> 
#include <stdio.h> 
#include <time.h> 
#include <assert.h> 

#include "bullets.hpp" 
#include "enemies.hpp" 

BulletPool::BulletPool() { //no matching function for call to 'Bullet::Bullet()' 
    // The first one is available. 
    firstAvailable_ = &bullets_[0]; 

    // Each particle points to the next. 
    for (int i = 0; i < POOL_SIZE - 1; i++) 
    { 
    bullets_[i].setNext(&bullets_[i + 1]); 
    } 

    // The last one terminates the list. 
    bullets_[POOL_SIZE - 1].setNext(NULL); 
} 


Bullet::Bullet(sf::Vector2f pos, sf::Color color, float bullet_radius, bool enemy, sf::Vector2f vel) { // candidate expects 6 arguments, 0 provided 
    onScreen_=true; 
    inUse = true; 
    state_.live.enemy_ = enemy; 
    state_.live.velocity_ = vel; 
    shape.setRadius(bullet_radius); 
    shape.setOrigin(bullet_radius, bullet_radius); 
    shape.setFillColor(color); 
    shape.setPosition(pos); 
} 

void Bullet::update(sf::Vector2f screen) { 
    shape.move(state_.live.velocity_); 
    if((shape.getGlobalBounds().top < 0 || shape.getGlobalBounds().top > 200/*screen.y*/)&& !state_.live.enemy_) { 
     onScreen_ = false; 
    } 

    if(!onScreen_) { 
     inUse = false; 
    } 
} 
void BulletPool::create(sf::Vector2f pos, sf::Color color, float bullet_radius, bool enemy, sf::Vector2f vel) { 

    assert(firstAvailable_ != NULL); 

    Bullet* newBullet = firstAvailable_; 
    firstAvailable_ = newBullet->getNext(); 
    newBullet = new Bullet(pos,color,bullet_radius,enemy,vel); 

    // Find an available particle. 
    /*for (int i = 0; i < POOL_SIZE; i++) { 

     if (!bullets_[i].inUse()) { 

      bullets_[i].init(pos,color,bullet_radius,enemy,vel); 
      return; 
     } 
    }*/ 
} 

void BulletPool::update(sf::RenderWindow window) { //initializing argument 1 of 'void BulletPool::update(sf::RenderWindow)' 
    for (int i = 0; i < POOL_SIZE; i++) { 
     if (!bullets_[i].inUse) { 
      // Add this particle to the front of the list. 
      bullets_[i].setNext(firstAvailable_); 
      firstAvailable_ = &bullets_[i]; 
     } else { 
      window.draw(bullets_[i].shape); 
     } 
    } 
} 
Enemy::~Enemy() {}; 
RedShip::RedShip(sf::Vector2f pos,float side_ln) { 
    movement = 10; 
    shape.setPointCount(6); 
    shape.setPoint(0, sf::Vector2f(side_ln/2, 0)); 
    shape.setPoint(1, sf::Vector2f(side_ln*3/8,side_ln*3/8)); 
    shape.setPoint(2, sf::Vector2f(0,side_ln*1/8)); 
    shape.setPoint(3, sf::Vector2f(side_ln/2,side_ln)); 
    shape.setPoint(4, sf::Vector2f(side_ln,side_ln*1/8)); 
    shape.setPoint(5, sf::Vector2f(side_ln*5/8,side_ln*3/8)); 
    shape.setFillColor(sf::Color::Transparent); 
    shape.setOutlineColor(sf::Color::Red); 
    shape.setOutlineThickness(5); 
    shape.setOrigin(side_ln/2, sqrt((3*side_ln*side_ln)/4)); 
    shape.setPosition(pos); 
} 

void RedShip::update(float base_time, BulletPool bullets) { 
    if(movement > 1) { 
     shape.move(3,1.5); 
     movement--; 
    } 
    else if(movement < -1) { 
     shape.move(-3,1.5); 
     movement++; 
    } 
    else if(movement == -1) 
     movement = 30; 
    else 
     movement = -30; 

    if(fmod(base_time,20)==0) { 
    bullets.create({shape.getPosition().x, shape.getPosition().y + shape.getLocalBounds().height/2}, sf::Color::Red, 4,true, {0,6}); 
    } 
} 


GreenShip::GreenShip(sf::Vector2f pos, float side_ln) { 
    movement={}; 
    shape.setPointCount(8); 
    shape.setPoint(0, sf::Vector2f(0, 0)); 
    shape.setPoint(1, sf::Vector2f(0,side_ln*2/3)); 
    shape.setPoint(2, sf::Vector2f(side_ln/2,side_ln)); 
    shape.setPoint(3, sf::Vector2f(side_ln,side_ln*2/3)); 
    shape.setPoint(4, sf::Vector2f(side_ln,0)); 
    shape.setPoint(5, sf::Vector2f(side_ln*3/4,side_ln/2)); 
    shape.setPoint(6, sf::Vector2f(side_ln/2,side_ln*3/8)); 
    shape.setPoint(7, sf::Vector2f(side_ln*1/4,side_ln/2)); 
    shape.setFillColor(sf::Color::Transparent); 
    shape.setOutlineColor(sf::Color::Green); 
    shape.setOutlineThickness(5); 
    shape.setOrigin(side_ln/2, sqrt((3*side_ln*side_ln)/4)); 
    shape.setPosition(pos); 
} 

void GreenShip::update(float base_time,BulletPool bullets) { 

    shape.move(0,1); 

    if(fmod(base_time,60)==0) { 
    //bullets.push_back(new Bullet({shape.getPosition().x, shape.getPosition().y + shape.getLocalBounds().height/2 + 4}, sf::Color::Green, 4,true, 2)); 
    } 
} 

class Core { 
public: 
    const float core_velocity{5}; 
    int bullet_count{0}; 

    sf::ConvexShape shape; 
    sf::Vector2f velocity; 

    Core(float sX, float sY, float scale) { 
     shape.setPointCount(12); 
     shape.setPoint(0,{scale/2,0}); 
     shape.setPoint(1,{scale*7/16,scale*2/16}); 
     shape.setPoint(2,{scale*6/16,scale*4/16}); 
     shape.setPoint(3,{scale*5/16,scale*7/16+scale/3}); 
     shape.setPoint(4,{0,scale*10/16+scale/2}); 
     shape.setPoint(5,{0,scale*13/16+scale/3}); 
     shape.setPoint(6,{scale*8/16,scale*10/16+scale/3}); 
     shape.setPoint(7,{scale,scale*13/16+scale/3}); 
     shape.setPoint(8,{scale,scale*10/16+scale/2}); 
     shape.setPoint(9,{scale*11/16,scale*7/16+scale/3}); 
     shape.setPoint(10,{scale*10/16,scale*4/16}); 
     shape.setPoint(11,{scale*9/16,scale*2/16}); 
     shape.setFillColor(sf::Color::Transparent); 
     shape.setOutlineColor(sf::Color::White); 
     shape.setOutlineThickness(7); 
     shape.setOrigin(scale/2, scale/2); 
     shape.setPosition(sX, sY); 
    } 

    void update() { 

     if(sf::Keyboard::isKeyPressed(sf::Keyboard::Left)) 
      velocity.x = -core_velocity; 
     else if(sf::Keyboard::isKeyPressed(sf::Keyboard::Right)) 
      velocity.x = core_velocity; 
     else 
      velocity.x = 0; 

     if(sf::Keyboard::isKeyPressed(sf::Keyboard::Up)) 
      velocity.y = -core_velocity; 
     else if(sf::Keyboard::isKeyPressed(sf::Keyboard::Down)) 
      velocity.y = core_velocity; 
     else 
      velocity.y = 0; 

     shape.move(velocity); 

    } 

    void fire(BulletPool bullets) { 
     if(bullet_count < 3) { 
      bullets.create({shape.getPosition().x, shape.getPosition().y-shape.getLocalBounds().height/2 -1}, sf::Color::White, 6,false,{0,-8}); 
      bullet_count++; 
     } 
    } 
}; 


int main(int argc, char *argv[]) { 

    const sf::Vector2f res{480,640}; 
    printf("Religion ist das Opium des Volkes.\n    -Marx\n"); 
    sf::RenderWindow window(sf::VideoMode(res.x,res.y), "Brick Breaker", sf::Style::None); 

    float base_time{0}; 
    Core core(res.x/2, res.y /2 + 200, 64); 
    GreenShip ship({res.x/2,50},50); 
    GreenShip ship1({res.x/2+100,50},50); 
    BulletPool bullets; 
    //std::vector<Enemy*> enemies; 


    while (window.isOpen()) 
    { 
     sf::Event event; 
     while (window.pollEvent(event)) 
     { 
      switch (event.type) 
       { 

        case sf::Event::Closed: 
         window.close(); 
         break; 

        case sf::Event::KeyPressed: 
         switch (event.key.code) { 

          case sf::Keyboard::Q: 
           core.fire(bullets); 
           break; 

          case sf::Keyboard::Escape: 
           window.close(); 
           break; 

          default: 
           break; 
         } 
         break; 

        default: 
         break; 
     } 
     } 

     if(base_time<3600) 
      base_time++; 
     else 
      base_time=0; 

     window.clear(); 
     window.setFramerateLimit(60); 

     core.update(); 
     window.draw(core.shape); 

     ship.update(base_time,bullets); 
     window.draw(ship.shape); 

     ship1.update(base_time,bullets); 
     window.draw(ship1.shape); 

     bullets.update(window); //use of deleted function 'sf::RenderWindow::RenderWindow(const sf::RenderWindow&)' 

     /*for(auto& b : bullets) { 
      if(!b->onScreen) { 
       core.bullet_count--; 
      } 
      else { 
       window.draw(b->shape); 
       b->update(res,base_time,bullets); 
      } 
     }*/ 
     window.display(); 
    } 

    return 0; 
} 

#ifndef ENEMIES_HPP 
#define ENEMIES_HPP 

class Enemy{ 
public: 
    sf::ConvexShape shape; 
    int movement; 
    virtual void update(float base_time, BulletPool bullets) = 0; 
    virtual ~Enemy() = 0; 
}; 



class RedShip: public Enemy{ 
public: 
    RedShip(sf::Vector2f pos, float side_ln); 
    void update(float base_time, BulletPool bullets); 
}; 

class GreenShip: public Enemy{ 
public: 
    GreenShip(sf::Vector2f pos, float side_ln); 
    void update(float base_time, BulletPool bullets); 
}; 



#endif 

bullets.hpp

#ifndef BULLETS_HPP 
#define BULLETS_HPP 

class Bullet{ //Bullet::Bullet(Bullet&&)// CANT UNDERSTAND WHY THIS POPS UP 
public: 
    sf::CircleShape shape; 
    Bullet(); //unless i add this constructor it gives the error below↓ 
    Bullet* getNext() const { return state_.next_; } 
    void setNext(Bullet* next) { state_.next_ = next; } 
    Bullet(sf::Vector2f pos, sf::Color color, float bullet_radius, bool enemy, sf::Vector2f vel); //Bullet::Bullet(sf::Vector2f, sf::Color, float, bool, float, float) 
    void update(sf::Vector2f screen); 
    bool inUse; 

private: 
    bool onScreen_=true; 
    union { //'Bullet::<anonymous union>::<constructor>()' is implicitly deleted because the default definition would be ill-formed: 
     struct { 
     bool enemy_; 
     sf::Vector2f velocity_; 
     } live; //union member 'Bullet::<anonymous union>::live' with non-trivial 'Bullet::<anonymous union>::<anonymous struct>::<constructor>()' 

     Bullet *next_; 

    } state_; 
}; 

class BulletPool{ 
public: 
    BulletPool(); 
    void create(sf::Vector2f pos, sf::Color color, float bullet_radius, bool enemy, sf::Vector2f vel); 
    void update(sf::RenderWindow window); 

private: 
    static const int POOL_SIZE = 100; 
    Bullet bullets_[POOL_SIZE]; 
    Bullet* firstAvailable_; 
}; 

#endif 

enemies.hpp(このいずれかでエラーなし)すべてのエラーそれらが食に示されているとおり

[solved]use of deleted function 'Bullet::<anonymous union>::<constructor>()' 

initializing argument 1 of 'void BulletPool::update(sf::RenderWindow)' 

use of deleted function 'sf::RenderWindow::RenderWindow(const sf::RenderWindow&)' 

'Bullet::<anonymous union>::<constructor>()' is implicitly deleted because the default definition would be ill-formed: 

union member 'Bullet::<anonymous union>::live' with non-trivial 'Bullet::<anonymous union>::<anonymous struct>::<constructor>()' 

コンパイラログ(mingw g ++):

10:22:57 **** Incremental Build of configuration Debug for project Black Lambda **** 
Info: Configuration "Debug" uses tool-chain "MinGW GCC" that is unsupported on this system, attempting to build anyway. 
Info: Internal Builder is used for build 
g++ -std=c++0x -DSFML_STATIC -D__GX_EXPERIMENTAL_CXX_0X__ -D_cplusplus=201103L "-IC:\\SFML-2.3.2\\include" -O0 -g3 -Wall -c -fmessage-length=0 -o main.o "..\\main.cpp" 
..\main.cpp: In constructor 'Bullet::Bullet(sf::Vector2f, sf::Color, float, bool, sf::Vector2f)': 
..\main.cpp:24:100: error: use of deleted function 'Bullet::<anonymous union>::<constructor>()' 
Bullet::Bullet(sf::Vector2f pos, sf::Color color, float bullet_radius, bool enemy, sf::Vector2f vel) { 
                            ^
In file included from ..\main.cpp:6:0: 
..\bullets.hpp:16:8: note: 'Bullet::<anonymous union>::<constructor>()' is implicitly deleted because the default definition would be ill-formed: 
    union { 
     ^
..\bullets.hpp:20:5: error: union member 'Bullet::<anonymous union>::live' with non-trivial 'Bullet::<anonymous union>::<anonymous struct>::<constructor>()' 
    } live; 
    ^
..\main.cpp: In function 'int main(int, char**)': 
..\main.cpp:261:30: error: use of deleted function 'sf::RenderWindow::RenderWindow(const sf::RenderWindow&)' 
     bullets.update(window); 
          ^
In file included from C:\SFML-2.3.2\include/SFML/Graphics.hpp:47:0, 
       from ..\main.cpp:1: 
C:\SFML-2.3.2\include/SFML/Graphics/RenderWindow.hpp:44:25: note: 'sf::RenderWindow::RenderWindow(const sf::RenderWindow&)' is implicitly deleted because the default definition would be ill-formed: 
class SFML_GRAPHICS_API RenderWindow : public Window, public RenderTarget 
         ^
C:\SFML-2.3.2\include/SFML/Graphics/RenderWindow.hpp:44:25: error: use of deleted function 'sf::Window::Window(const sf::Window&)' 
In file included from C:\SFML-2.3.2\include/SFML/Window.hpp:42:0, 
       from C:\SFML-2.3.2\include/SFML/Graphics.hpp:32, 
       from ..\main.cpp:1: 
C:\SFML-2.3.2\include/SFML/Window/Window.hpp:57:23: note: 'sf::Window::Window(const sf::Window&)' is implicitly deleted because the default definition would be ill-formed: 
class SFML_WINDOW_API Window : GlResource, NonCopyable 
        ^
In file included from C:\SFML-2.3.2\include/SFML/System/FileInputStream.hpp:34:0, 
       from C:\SFML-2.3.2\include/SFML/System.hpp:35, 
       from C:\SFML-2.3.2\include/SFML/Window.hpp:32, 
       from C:\SFML-2.3.2\include/SFML/Graphics.hpp:32, 
       from ..\main.cpp:1: 
C:\SFML-2.3.2\include/SFML/System/NonCopyable.hpp:67:5: error: 'sf::NonCopyable::NonCopyable(const sf::NonCopyable&)' is private 
    NonCopyable(const NonCopyable&); 
    ^
In file included from C:\SFML-2.3.2\include/SFML/Window.hpp:42:0, 
       from C:\SFML-2.3.2\include/SFML/Graphics.hpp:32, 
       from ..\main.cpp:1: 
C:\SFML-2.3.2\include/SFML/Window/Window.hpp:57:23: error: within this context 
class SFML_WINDOW_API Window : GlResource, NonCopyable 
        ^
In file included from C:\SFML-2.3.2\include/SFML/Graphics.hpp:47:0, 
       from ..\main.cpp:1: 
C:\SFML-2.3.2\include/SFML/Graphics/RenderWindow.hpp:44:25: error: use of deleted function 'sf::RenderTarget::RenderTarget(const sf::RenderTarget&)' 
class SFML_GRAPHICS_API RenderWindow : public Window, public RenderTarget 
         ^
In file included from C:\SFML-2.3.2\include/SFML/Graphics.hpp:45:0, 
       from ..\main.cpp:1: 
C:\SFML-2.3.2\include/SFML/Graphics/RenderTarget.hpp:51:25: note: 'sf::RenderTarget::RenderTarget(const sf::RenderTarget&)' is implicitly deleted because the default definition would be ill-formed: 
class SFML_GRAPHICS_API RenderTarget : NonCopyable 
         ^
In file included from C:\SFML-2.3.2\include/SFML/System/FileInputStream.hpp:34:0, 
       from C:\SFML-2.3.2\include/SFML/System.hpp:35, 
       from C:\SFML-2.3.2\include/SFML/Window.hpp:32, 
       from C:\SFML-2.3.2\include/SFML/Graphics.hpp:32, 
       from ..\main.cpp:1: 
C:\SFML-2.3.2\include/SFML/System/NonCopyable.hpp:67:5: error: 'sf::NonCopyable::NonCopyable(const sf::NonCopyable&)' is private 
    NonCopyable(const NonCopyable&); 
    ^
In file included from C:\SFML-2.3.2\include/SFML/Graphics.hpp:45:0, 
       from ..\main.cpp:1: 
C:\SFML-2.3.2\include/SFML/Graphics/RenderTarget.hpp:51:25: error: within this context 
class SFML_GRAPHICS_API RenderTarget : NonCopyable 
         ^
..\main.cpp:64:6: error: initializing argument 1 of 'void BulletPool::update(sf::RenderWindow)' 
void BulletPool::update(sf::RenderWindow window) { 
    ^

10:22:59 Build Finished (took 1s.427ms) 

私はちょうどC++ので 任意のヘルプまたはcritism高く評価され、感謝を学ぶしようとしています!

EDIT ありがとうございました。私はすべての問題を考え出した。 BulletPool :: updateの問題点は、renderwindowオブジェクトが参照なしで渡され、関数がウィンドウをコピーしてレンダリングしないということでした。

このエラーメッセージが言っているように、あなたが unionメンバーを持っている、ので、たまたま
+3

'sf :: Vector2f'は* pod *ではないので、あなたの' union'は[Unrestricted_union](https://en.wikipedia.org/wiki/C%2B%2B11#Unrestricted_unions)です。 – Jarod42

+0

@リチャード・ダリー私は、使用時には弾丸オブジェクトの値を格納し、そうでないときには次のポインタの値を格納するように設定しようとしています。 –

+0

@ Jarod42大変ありがとう、ポッドのあることを知りませんでした –

答えて

0

(あなたの匿名struct)デフォルトコンストラクタなしメンバー(velocity_)を持っていること(または非自明1、と)全体を作ります構造体は非POD(普通の古いデータ型ではありません)であり、コンパイラを防ぎます。

ここで関連ルールは、単純に言えば、unionの中に(この場合はsf::Vector2f)、の組み込みのコンストラクタ(デフォルトではのコンストラクタを書く必要があります例えば、デストラクタ、コピーctorなど)

あなたはそれについて考えるなら、これは合理的です。あなたがあなたのユニオンに複雑なものを持っているなら、コンパイラはそのユニオンのインスタンスがどのような状態で自分の人生を始めるのかを知る必要があります。

基本的に、このソリューションは、ユニオンタイプの名前を付けてから、単純な(空の)デフォルトコンストラクタを作成することになります。 ポインタをnullptrまたはthis+1または何かに初期化することをお勧めします。他の基本的な方法を書いたり、少なくとも指定する必要があります。

+0

組合の問題を修正したが、main.cppのエラーはまだ残っています。私はなぜ理解していないのですか?ソースを編集して、sf :: Vector2fの代わりに2つの浮動小数点を使用しましたが、まだエラーがありますか?また、空のコンストラクタを最初に追加しない限り、bullets.hppファイルにもエラーが発生します。 –

+0

申し分なく私はそれを考え出した。この問題はおそらく、クラス内の構造体がbeacuseであったため、箇条書きオブジェクトにデフォルトコンストラクタが割り当てられていたため、コンストラクタが機能しなくなりました –

関連する問題