C ++ Struct函数体调用另一个结构函数,相同的模块

时间:2014-12-16 06:14:19

标签: c++ function struct member chess

我正在尝试使用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最终练习题,所有的功能标题都是按说明设置的,所以我需要按照设置方式进行操作

4 个答案:

答案 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& [...]。在您的标头文件中添加&,它应该可以正常工作。