我正在尝试使用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()
设为静态。那么它应该可以在没有对象的情况下被调用。