2016-07-18 45 views
2

私はチェスエンジンを作ると、このコードを使用しています:クラスのコンストラクタが引数リストと一致しません....しかし、それは....?

#pragma once 

    #include "SFML\Graphics.hpp" 
    #include "Grid.h" 

    enum PieceType { //place gamePieces into Grid not field, cus grid is already in field 
     W_BISHOP, 
     W_PAWN, 
     W_KING, 
     W_QUEEN, 
     W_ROOK, 
     W_KNIGHT, 
     B_BISHOP, 
     B_PAWN, 
     B_KING, 
     B_QUEEN, 
     B_ROOK, 
     B_KNIGHT 
    }; 

class GamePieces //TODO PUT TEAM IN GRID, ACCESS GAME PIECES IN GRID TO MOVE THEM 
{ 
public: 
    GamePieces(){} 
    GamePieces(PieceType& type, Coords& position) : m_type(type),m_position(position) { 
     switch (type) { 
      case W_BISHOP: 
       m_gamePiece.loadFromFile("w_bishop"); 
       m_gamePieceSprite.setTexture(m_gamePiece); 
       break; 

      //REST OF CASES OF PIECETYPE ARE PRETTY MUCH THE SAME 

    } 
    ~GamePieces(); 
private: 
    sf::Texture m_gamePiece; 
    sf::Sprite m_gamePieceSprite; 
    Coords m_position; 
    PieceType m_type; 
}; 



enum TeamColor { 
    BLACK, 
    WHITE 
}; 

struct Team { 
    //16 pieces in regular chess 
    //map that assigns specific game pieces coordinates 

    GamePieces m_chessPieces[16]; 
    TeamColor color; 

    Team() {} 

    Team(TeamColor& c) { 
     Coords coord; 

     switch (c) { 
      case WHITE: 

       for (int i = 0; i < 8; i++) { 
        coord.m_x += 52.5; 
        coord.m_y += 52.5; 
        m_chessPieces[i] = GamePieces(PieceType::B_PAWN, coord); 
       } 
       break; 

は私が必要としなかった部分を切り取りますが、基本的にエラーがこの行で発生します。

GamePieces(PieceType::B_PAWN, coord); 

、それはコンストラクタを言いますGamePiecesに指定された引数リストはありませんが、それはあります!

答えて

2

一時はあなたのコンストラクタは、理由もなく、非const参照によってその引数を取り

GamePieces(const PieceType& type, const Coords& position) 

または

GamePieces(PieceType type, const Coords& position) 
2

にあなたのコンストラクタを変更、非constの参照にバインドすることはできません。

非const参照は、PieceType::B_PAWNなどの定数にバインドできません。

呼び出された関数の引数を変更しない限り、値でenumを渡す必要があります。 Coordなどの構造体をconst参照で渡す必要があります。小さければ単純なものでも構いません(const参照は安全なフォールバックオプションです)。

5

これは、const以外の参照に右辺値(PieceType::B_PAWN)を割り当てるためです。言語ではこれを行うことはできません。

解決策は、コンストラクタは、値またはconst参照で取るようにすることです:

GamePieces(PieceType type, const Coords& position) //... 
1

あなたの関数が間違っているようです。参照を削除します。

GamePieces(PieceType type, Coords position) 

UPDATE: 注行は上記の問題を解決する最も簡単な方法であること。以前のコメントでは、値やconst参照で引数を取ることができると述べています。

この場合、最初のオブジェクトは非常に小さいオブジェクトなので、値をとることができます。 2番目のものはより大きい(8バイト?)可能性があるので、cont参照によって取り込むことができます。この意味で、@ TartanLlamaの答えは完璧です。

それにもかかわらず、両方の値を取ることは、メソッドがインライン化され、コンパイラがコードを最適化する機会があるため(たとえば、スタックの代わりにレジスタを使用して引数を渡すなど)

0

構文:

GamePieces(PieceType::B_PAWN, coord); 

が正しくありません。変数enumの場合は、列挙型を宣言する必要はありません。正しい構文は以下の通りです:

GamePieces(B_PAWN, coord); 

宣言:あなたは非const参照を使用しているため

GamePieces(PieceType& type, Coords& position) 

が正しくありません。次のように変更する必要があります。

GamePieces(const PieceType& type, const Coords& position) 
関連する問題