Я пытаюсь создать модуль 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, и все заголовки функций были установлены инструкциями, поэтому мне нужно работать с их настройкой
Вам нужен объект типа 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()
статичный. Тогда это должно быть вызвано без объекта.
Проблема в том, что вы неправильно понимаете синтаксис вызова метода.
Если метод класса нестатичен (это означает, что у каждого объекта класса есть этот метод, и когда этот метод обращается к полям класса, он обращается к полям этого точного объекта), вы должны сообщить своему компилятору, какой объект вы хотите вызвать Этот метод.
Поэтому вы должны переписать свой код:
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
из этого конкретного поля.
Насколько я могу судить, ошибка заключается в разнице между объявлением и реализацией.
В декларации (Chess.h) у вас есть void initChessPiece(ChessPiece [...]
находясь в реализации (Chess.cpp), у вас есть initChessPiece(ChessPiece& [...]
, Добавить &
в вашем заголовочном файле, и он должен работать правильно.
Попробуйте изменить подписи 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);
}
}