Тело функции Struct C ++ вызывает другую функцию 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: ошибка: команда компоновщика завершилась неудачно с кодом выхода 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, и все заголовки функций были установлены инструкциями, поэтому мне нужно работать с тем, как они настроены.


person Taylor Petrychyn    schedule 16.12.2014    source источник
comment
У вас больше шансов получить помощь, если вы включите в свой вопрос полные и точные сообщения об ошибках (оба).   -  person Jeffrey Bosboom    schedule 16.12.2014
comment
Почему вы передаете кусок самому себе (по значению) в initChessPiece?   -  person Jonathan Potter    schedule 16.12.2014
comment
Где вы определяете initChessPiece(...)? Есть ли другой исходный файл, о котором вы нам не рассказали? И какой инструмент вы используете, чтобы это построить?   -  person Beta    schedule 16.12.2014
comment
В вашем коде есть основные ошибки для определения ChessPiece. Вам будет лучше выучить язык с помощью учебника или учебника, прежде чем некоторые из допущенных вами ошибок обретут смысл. Вы можете попробовать базовое руководство по адресу tutorialspoint.com/cplusplus/cpp_classes_objects.htm.   -  person R Sahu    schedule 16.12.2014


Ответы (4)


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

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

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

person warsac    schedule 16.12.2014
comment
Я попытался вызвать функцию из объекта game.pieces [i], но затем получил ошибку компоновщика из основного сообщения. Кроме того, когда я помещаю это ›имя и т. Д., Я получаю сообщение об ошибке« Недопустимое использование this »вне нестатической функции-члена. - person Taylor Petrychyn; 16.12.2014
comment
Извините, я отредактировал свой ответ. (Edit2) Вам нужно охватить определение вашей функции. - person warsac; 16.12.2014
comment
Насколько я понимаю, и после тестирования вам не нужно / нельзя выполнять разрешение области для структурных функций, это нужно только функциям класса. То же самое с этим - person Taylor Petrychyn; 16.12.2014
comment
Я исправился. Мне действительно нужно использовать область видимости, когда я объявляю тело функции initChessPiece, а также вызываю ее для объекта ChessPiece. Огромное спасибо - person Taylor Petrychyn; 16.12.2014

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

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

to

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

person Arsenii Fomin    schedule 16.12.2014

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

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

person Signal    schedule 16.12.2014

Попробуйте изменить подписи 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);
}
}
person regmagik    schedule 16.12.2014
comment
Вот как я обычно это делаю, но я изучаю свой CS Final, и это пример вопроса, поэтому мне нужно использовать структуры и передавать объект в качестве параметра - person Taylor Petrychyn; 16.12.2014
comment
Я изменил образец кода, чтобы использовать структуру и передать объект в качестве параметра в readChessGame. - person regmagik; 16.12.2014
comment
Если вам действительно нужно передать ChessPiece& в initChessPiece, вы можете объявить его как static: static initChessPiece(ChessPiece& piece, const string& colour, const string& name, unsigned int row, unsigned int column); и вызвать через ChessPiece :: initChessPiece, но это не рекомендуется для стиля кодирования C ++. - person regmagik; 16.12.2014
comment
Спасибо за вашу помощь, я попытался скомпилировать ваши предложения на другой машине, но по-прежнему получаю ошибку компоновщика: Не определен первый ссылочный символ в файле ChessPiece :: initChessPiece (ChessPiece, std :: basic_string ‹char, std :: char_traits ‹char›, std :: allocator ‹char› ›const &, std :: basic_string‹ char, std :: char_traits ‹char›, std :: allocator ‹char› ›const &, unsigned int, unsigned int) /var/tmp//cc6KtmVI.o - person Taylor Petrychyn; 16.12.2014