我正在尝试使用ChessPiece结构和ChessGame结构来制作Chess模块​​。使用XCode 6.1.1。这是我的Chess.cpp文件中涉及的头文件和功能。我收到错误消息,“使用未声明的标识符'initChessPiece'的意思是'ChessPiece :: initChessPiece'?。如果进行此更改,它将显示错误,'调用没有对象参数的非堆栈成员函数。'最后,如果我下线,

game.pieces[i].initChessPiece(game.pieces[i], color, piece, x, y);


链接器抛出错误:

架构x86_64的未定义符号:
  “ ChessPiece :: initChessPiece(ChessPiece,std :: __ 1 :: basic_string,std :: __ 1 :: allocator> const&,std :: __ 1 :: basic_string,std :: ____ 1 :: allocator> const&,unsigned int,unsigned int) ”,引用自:
      在Chess.o中的readChessGame(ChessGame&,std :: __ 1 :: basic_string,std :: __ 1 :: allocator> const&)
ld:找不到架构x86_64的符号
clang:错误:链接器命令失败,退出代码为1(使用-v查看调用)

#ifndef CHESS_H
#define CHESS_H

#include <stdio.h>
#include <string>

using namespace std;

const int ROWS = 8;
const int COLUMNS = 8;

struct ChessPiece {

string name;
string colour;
unsigned int row;
unsigned int column;
void initChessPiece(ChessPiece, const string& colour, const string& name, unsigned int row, unsigned int column);
string getStringColourChessPiece(const ChessPiece&) const;
string getStringNameChessPiece(const ChessPiece&) const;

friend class ChessGame;
};

struct ChessGame {
unsigned int chessBoard[ROWS][COLUMNS];
ChessPiece pieces[32];

void readChessGame(ChessGame&, const string& filename);
void printChessGame(const ChessGame&);
int scoreChessGame(const ChessGame&) const;
bool isFinished(const ChessGame&) const;
};


#endif


国际象棋

#include "Chess.h"
void readChessGame(ChessGame& game, const string& filename) {

ifstream inData;
inData.open(filename.c_str());

string color;
string piece;
unsigned int x;
unsigned int y;
for (int i=0;i<32;i++) {
    inData >> color >> piece >> x >> y;
    initChessPiece(game.pieces[i], color, piece, x, y);
}
}

void initChessPiece(ChessPiece& piece, const string& colour, const string& name, unsigned int row, unsigned int column) {
piece.row = row;
piece.column = column;
piece.name = name;
piece.colour = colour;
}


这是我的CS最终实践问题,所有功能标头均由说明设置,因此我需要使用它们的设置方式

最佳答案

您需要类型为ChessPiece的对象才能调用initChessPiece()

像这样:

#include "Chess.h"
void readChessGame(ChessGame& game, const string& filename) {

    ifstream inData;
    inData.open(filename.c_str());

    string color;
    string piece;
    unsigned int x;
    unsigned int y;
    for (int i=0;i<32;i++) {
        inData >> color >> piece >> x >> y;
        game.pieces[i].initChessPiece(game.pieces[i], color, piece, x, y);
    }
}


您可能应该删除piece参数,因为您将通过this指针在函数中使用该对象。如果决定保留它,则需要使其成为引用或指针,以能够更改数组中各部分的值。

 game.pieces[i].initChessPiece(color, piece, x, y);


编辑2:
     无效ChessPiece :: initChessPiece(const string&colour,const string&name,unsigned int row,unsigned int column)
    {
        this-> name = name;
        this-> colour =颜色;
        this-> row = row;
        this-> column =列;
    }

我认为您还应该考虑使它成为构造函数。

编辑:
如果要保持通话风格,可以将initChessPiece()设为静态。那么它应该可以在没有对象的情况下被调用。

10-06 11:45