C ++ Beginner - проблема с использованием классов внутри классов - PullRequest
0 голосов
/ 10 мая 2010

Я работаю над проектом колледжа, где мне нужно реализовать простую игру «Скрэббл».

У меня есть класс player (содержащий счет и руку игрока в форме std::string и класс score (содержащий имя и числовой (int) счет).

Одной из Player функций-членов является Score getScore(), которая возвращает объект Score для этого игрока. Тем не менее, я получаю следующую ошибку во время компиляции:

player.h(27) : error C2146: syntax error : missing ';' before identifier 'getScore'
player.h(27) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
player.h(27) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
player.h(27) : warning C4183: 'getScore': missing return type; assumed to be a member function returning 'int'
player.h(35) : error C2146: syntax error : missing ';' before identifier '_score'
player.h(35) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
player.h(35) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int

Вот строки 27 и 35 соответственно:

Score getScore(); //defined as public
(...)
Score _score; //defined as private

Я понял, что компилятору не удается распознать Score как допустимый тип ... Но почему? Я правильно включил Score.h в начале player.h:

#include "Score.h"
#include "Deck.h"
#include <string>

У меня есть конструктор по умолчанию для Score, определенный в Score.h:

Score(); //score.h

//score.cpp
Score::Score()
{
    _name = "";
    _points = 0;
}

Любой вклад будет оценен!

Спасибо за ваше время,

Francisco

EDIT:

По запросу, score.h и player.h: http://pastebin.com/3JzXP36i http://pastebin.com/y7sGVZ4A

Ответы [ 3 ]

7 голосов
/ 10 мая 2010

У вас есть проблема кругового включения - в этом случае ее относительно легко исправить.

Удалить #include "Player.h" из Score.h.


См. этот вопрос для объяснения и обсуждения того, что вам нужно сделать, если Score действительно использовал Player.


Что касается ошибок компилятора, которые вы получаете, вот как компилятор Microsoft сообщает об использовании неопределенных типов - вы должны научиться мысленно переводить их все в «Тип, используемый в объявлении, не определенном».

3 голосов
/ 10 мая 2010

Ваша проблема в рекурсивном включении : Score.h пытается включить Player.h, а Player.h пытается включить Score.h. Поскольку класс Score, по-видимому, фактически не использует класс Player, удаление #include "Player.h" из Score.h должно решить вашу проблему.

1 голос
/ 10 мая 2010

У вас проблема циклической зависимости : Score.h включает Player.h и Player.h включает Score.h.

Решите эту проблему, удалите ваше включение в Player.h в Score.h и определите class Player;, если вам нужно использовать его в классе Score.

...