Я получил указание написать код для проекта «Блэкджек» для своего колледжа CMSC. Я сделал все необходимые исходные файлы, но есть ошибка, которую я не могу выяснить. Я использую терминал с Makefile для компиляции моей программы.
Когда я компилирую свою программу, я получаю эту ошибку в терминале вместе с другими предупреждениями (меня не волнуют предупреждения).
In file included from Blackjack.h:19:0,
from Proj2.cpp:12:
Player.h:17:3: error: ‘Hand’ does not name a type
Hand hand;
^
In file included from Blackjack.h:19:0,
from Blackjack.cpp:1:
Player.h:17:3: error: ‘Hand’ does not name a type
Hand hand;
Вот мой исходный код в репозитории Github.
https://github.com/Terrablezach/Blackjack
Может кто-нибудь сказать мне, почему класс «Рука» не называет тип? Я включил его в мои заголовочные файлы, где он должен быть включен, и я не понимаю, почему он не распознает его как класс.
Спасибо заранее за вашу помощь.
Глядя на краткое описание проекта, вы можете изменить код, исправить ошибки и включить заказы, однако в нем говорится, что вы не можете изменять объявления функций (это будет ограничивать возможное количество изменений в функциональности кода, которые я подозреваю).
Объявление функции это просто строка: Player(char *newName, int newFunds)
Глядя на ваш код, вы потенциально можете столкнуться с проблемами с циклическим включением в ваши заголовки.
Что вы могли бы сделать, это обернуть каждый заголовок в небольшой кусочек логики, чтобы предотвратить включение одного и того же файла несколько раз, например, добавить строки
#pragma once
// the #pragma effectively does the same as the #ifndef/#define lines,
// its the equivalent of belt and braces if you use both
#ifndef HAND_H
#define HAND_H
//normal hand.h code in here
#endif
таким образом, независимо от того, сколько раз вы вызываете файл hand.h, вы не можете получить многократно определенный / включенный заголовок. На деле я делаю это со всеми моими заголовочными файлами, в то же время проводя быструю разработку.
Что касается конкретно ошибки Player.h:17:3: error: ‘Hand’ does not name a type
Я подозреваю, что предыдущий комментарий относительно порядка включения правильный, однако у меня нет среды linux, но я вернусь к вам позже сегодня вечером / завтра 🙂
Hand hand;
Вы не включили Hand.h
в Player.h
так что определение Hand
там нет
Порядок объявлений #include неверен.
Класс игрока зависит от объявления класса Hand. Так что в Blackjack.h должен идти #include для Hand.h до #include для Player.h
#ifndef BLACKJACK_H
#define BLACKJACK_H
#include <vector>
#include "Hand.h" // must be before Player.h include
#include "Player.h"
Кроме того, в Player.h можно использовать предварительное объявление.
class Hand; // forward declaration of class Hand
class Player {
public:
Player();
Player(char *newName, int newFunds);
...
...