【问题标题】:Constant X is not a type name, here x is KING常量 X 不是类型名称,这里 x 是 KING
【发布时间】:2019-05-19 14:16:06
【问题描述】:

我在传递给 Piece 构造函数的 KING 和 COLOR 参数上遇到错误。这是我的代码,我正在制作一个带有 main 类的国际象棋游戏,然后 tehre 是一个游戏类,它制作一个棋盘对象,棋盘玩游戏,并将方块和棋子作为组件对象。他们都在建立关联关系

 /////////////////////////PIECE HEADER///////////////////
enum PIECETYPE { KING, QUEEN, ROOK, BISHOP, KNIGHT, PAWN };
enum COLOR { BLACK, WHITE };
class Square;//forward declaration

class Piece
{
    PIECETYPE type;
    COLOR color;
    ...};
/////////////////////PIECE CPP////////////////////////

#include "Piece.h"
#include"Square.h"



Piece::Piece()
{
}
Piece::Piece(PIECETYPE typ, COLOR clr){
    type = typ;
    color = clr;
    pSquare = nullptr;
}
//////////////////////BOARD HEADER: COMPOUNDCLASS////////////////////////
#include"Piece.h"``


class Board
{
    Square square[8][8];
    Piece wK(KING, WHITE);
    Piece bK(KING, BLACK);};

【问题讨论】:

  • 对于编译器来说,那些看起来像函数声明。您可以拥有 Piece 成员,但您需要在构造函数中初始化它们。
  • 只需在声明中使用大括号构造即可:Piece wK{KING, WHITE};
  • 你用的是什么编译器?什么版本?
  • 我正在使用 VS 2015

标签: c++ oop enums


【解决方案1】:

在声明类的成员变量时,您不能使用该构造函数语法。编译器不知道您是否尝试声明名称为wK 并返回类型为Piece 的成员函数,在这种情况下KING 应该是第一个参数的类型。

class Board {
    Piece wK(KING, WHITE);  // ERROR: this is declaring wK and using its constructor in ambigous way.
    ...
};

这是这样做的方法:

class Board {
    Piece wK;  // declaring the member wK
    Board() : wk(KING, WHITE) {}  // initialize wK in the Board constructor
    ...
};

或者,在 C++11 中

class Board {
    Piece wK{KING, WHITE};  // Using {} instead of () makes it clear you are not declaring a function
    ...
};

【讨论】:

【解决方案2】:

在您的 Board 类中,像为 Squares 所做的那样创建一组棋子。请参阅下面的 CreatePieces() 方法:

#include <iostream>
#include <memory>

using namespace std;

enum PIECETYPE { KING, QUEEN, ROOK, BISHOP, KNIGHT, PAWN };
enum COLOR { BLACK, WHITE };
enum RANK { A, B, C, D, E, F, G, H };

class Square
{
public:
    explicit Square() { }

private:
    //COLOR color;
    //RANK rank;
    //int file;
};

class Piece
{
public:
    explicit Piece(PIECETYPE typ, COLOR clr) : type(typ), color(clr) { }

private:
    PIECETYPE type;
    COLOR color;
    Square* pSquare{ nullptr };
};

class Board
{
public:
    explicit Board()
    {
        CreatePieces();
        // Set the pieces in their proper location, etc.
    }

private:
    Square squares[8][8];
    vector<Piece> pieces;

    inline void CreatePieces()
    {
        pieces.emplace_back(Piece(KING, WHITE));
        pieces.emplace_back(Piece(KING, BLACK));
        // etc. for 30 other pieces
    }
};

int main()
{
    unique_ptr<Board> board = make_unique<Board>();
    getchar();
}

【讨论】:

  • 这不是对所提问题的回答。
  • 您的代码中有很多我不明白的地方,首先是库内存和无序映射,然后是显式的,我被卡住了。没用过大括号
  • @RoshaanAhmed 如果您愿意,可以省略显式关键字,不用担心。这只是防止构造函数进行类型转换的好习惯。包含内存库是为了使用 unique_ptr,但如果它让您感到困惑,您不需要使用它。您的构造函数也使用花括号。我的可能看起来很有趣,因为那个范围是空的。不需要无序地图包含 - 这是处理不同问题时遗留下来的。我会删除它。
  • @n.m.没有人问。原始发帖人抱怨了一个错误,而我的回复显示了一种在原始上下文中删除错误的方法。
  • @Overbyte 您的设计更改仅适用于这种狭窄的环境。它不会帮助任何人避免在稍微不同的上下文中出现类似的错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-15
  • 1970-01-01
  • 1970-01-01
  • 2011-01-07
  • 1970-01-01
  • 2015-11-22
相关资源
最近更新 更多