我正在尝试使用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
Chess.cpp
#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最终练习题,所有的功能标题都是按说明设置的,所以我需要按照设置方式进行操作
答案 0 :(得分:1)
您需要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);
EDIT2: void ChessPiece :: initChessPiece(const string&amp; color,const string&amp; name,unsigned int row,unsigned int column) { this-&gt; name = name; this-&gt; color = color; this-&gt; row = row; this-&gt; column = column; }
我认为您还应该考虑将其作为构造函数。
编辑:
如果你想保持你的通话风格,你可以使initChessPiece()
静态。然后它应该可以在没有对象的情况下调用。
答案 1 :(得分:0)
问题在于你对方法调用语法的误解。 如果类的方法是非静态的(这意味着类的每个对象都有此方法,并且当此方法访问类的字段时它访问该确切对象的字段),您应该告诉编译器您要调用哪个对象这种方法。 所以你应该重写你的代码:
void initChessPiece(ChessPiece, const string& colour, const string& name, unsigned int row, unsigned int column);
到
void initChessPiece(const string& colour, const string& name, unsigned int row, unsigned int column);
并按照以下方式调用方法:
game.pieces[i].initChessPiece(color, piece, x, y);
所以你取具体对象game
,然后取其具体字段game.pieces[i]
,然后从该具体字段调用方法initChessPiece
。
答案 2 :(得分:0)
尝试将initChessPiece的签名更改为:
void initChessPiece(const string& colour, const string& name, unsigned int row, unsigned int column);
然后使用object.Member()语法调用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(color, piece, x, y);
}
}
答案 3 :(得分:0)
据我所知,错误在于声明和实现之间的区别。
在声明(Chess.h)中,在实现(Chess.cpp)中,您有initChessPiece(ChessPiece [...]
,initChessPiece(ChessPiece& [...]
。在您的标头文件中添加&
,它应该可以正常工作。