Тело функции C ++ Struct, вызывающее другую функцию struct, тот же модуль

Я пытаюсь создать модуль Chess, используя структуру ChessPiece и структуру ChessGame. Использование 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) «, на которую ссылаются:
readChessGame (ChessGame&, std :: __ 1 :: basic_string, std :: __ 1 :: allocator> const&) в Chess.o
ld: символы не найдены для архитектуры x86_64
clang: error: команда компоновщика завершилась неудачно с кодом выхода 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

Решение

Вам нужен объект типа 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 (постоянная строка& цвет, постоянная строка& имя, строка без знака int, столбец без знака int)
{
это-> имя = имя;
это-> цвет = цвет;
это-> строка = строка;
это-> столбец = столбец;
}

Я думаю, вы также должны подумать о том, чтобы сделать это конструктором.

Редактировать:
Если вы хотите сохранить свой стиль вызова, вы можете сделать initChessPiece() статичный. Тогда это должно быть вызвано без объекта.

1

Другие решения

Проблема в том, что вы неправильно понимаете синтаксис вызова метода.
Если метод класса нестатичен (это означает, что у каждого объекта класса есть этот метод, и когда этот метод обращается к полям класса, он обращается к полям этого точного объекта), вы должны сообщить своему компилятору, какой объект вы хотите вызвать Этот метод.
Поэтому вы должны переписать свой код:

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 из этого конкретного поля.

0

Насколько я могу судить, ошибка заключается в разнице между объявлением и реализацией.

В декларации (Chess.h) у вас есть void initChessPiece(ChessPiece [...] находясь в реализации (Chess.cpp), у вас есть initChessPiece(ChessPiece& [...], Добавить & в вашем заголовочном файле, и он должен работать правильно.

0

Попробуйте изменить подписи initChessPiece на это:

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

Затем вызовите initChessPiece с использованием синтаксиса object.Member (), например:

#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);
}
}
0
По вопросам рекламы [email protected]