linux — класс не называет тип

Я получил указание написать код для проекта «Блэкджек» для своего колледжа 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

Может кто-нибудь сказать мне, почему класс «Рука» не называет тип? Я включил его в мои заголовочные файлы, где он должен быть включен, и я не понимаю, почему он не распознает его как класс.

Спасибо заранее за вашу помощь.

0

Решение

Глядя на краткое описание проекта, вы можете изменить код, исправить ошибки и включить заказы, однако в нем говорится, что вы не можете изменять объявления функций (это будет ограничивать возможное количество изменений в функциональности кода, которые я подозреваю).

Объявление функции это просто строка: 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
Hand hand;
Я подозреваю, что предыдущий комментарий относительно порядка включения правильный, однако у меня нет среды linux, но я вернусь к вам позже сегодня вечером / завтра 🙂

1

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

Вы не включили Hand.h в Player.hтак что определение Hand там нет

2

Порядок объявлений #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);
...
...
1
По вопросам рекламы [email protected]