C ++ пытается использовать операторы #ifndef и #include

Итак, я профессионал HTML / Javascript / PHP, но я пытаюсь изучать C ++. Я все еще новичок в этом, и у меня есть проект программирования C ++, с которым у меня есть ошибки.

Файл, который содержит int main () — это football.cpp, и у меня есть файлы .h и .cpp для трех классов, которые мне нужно использовать: Game, Team и Date. Каждый экземпляр команды содержит вектор игр, а каждая игра содержит дату. Дата не содержит экземпляров какого-либо другого класса.

Я пытаюсь найти способ использовать операторы #include и #ifndef в верхних частях файлов, чтобы не получать ошибок при компиляции, но я не нашел комбинацию, которая работает. Я не уверен, есть ли другие ошибки. Вот мои текущие разделы #include, не считая других библиотек:

football.cpp

#include "game.h"#include "team.h"#include "date.h"

team.h

#ifndef __game_h_
#define __game_h_
#endif

team.cpp

#include "team.h"#ifndef __game_h_
#define __game_h_
#endif

game.h

#ifndef __date_h_
#define __date_h_
#endif

game.cpp

#include "game.h"#ifndef __date_h_
#define __date_h_
#endif

date.cpp

#include "date.h"

Я использую Cygwin G ++ компилятор, и строка, которую я использую для его компиляции:

g++ football.cpp team.cpp game.cpp date.cpp -o football.exe

Вот все ошибки, которые я получаю: (ПРЕДУПРЕЖДЕНИЕ, СТЕНА ТЕКСТА)

$ g++ football.cpp team.cpp game.cpp date.cpp -o football.exe

In file included from football.cpp:9:0:
game.h:15:96: error: ‘Date’ has not been declared
game.h:24:1: error: ‘Date’ does not name a type
game.h:37:1: error: ‘Date’ does not name a type
football.cpp: In function ‘int main(int, char*)’:
football.cpp:65:70: error: no matching function for call to ‘Game::Game(std::string&, std::string&, int [5], int [5], Date&)’
game.h:15:1: note: candidates are: Game::Game(std::string, std::string, const int, const int*, int)
game.h:14:1: note: Game::Game()
game.h:10:12: note: Game::Game(const Game&)
In file included from team.cpp:4:0:
team.h:24:8: error: ‘Game’ was not declared in this scope
team.h:24:12: error: template argument 1 is invalid
team.h:24:12: error: template argument 2 is invalid
team.cpp: In member function ‘float Team::getStat3()’:
team.cpp:36:26: error: request for member ‘size’ in ‘((Team*)this)->Team::games’, which is of non-class type ‘int’
team.cpp:37:21: error: invalid types ‘int[int]’ for array subscript
team.cpp:37:50: error: invalid types ‘int[int]’ for array subscript
team.cpp:38:21: error: invalid types ‘int[int]’ for array subscript
team.cpp:38:47: error: invalid types ‘int[int]’ for array subscript
team.cpp:38:76: error: invalid types ‘int[int]’ for array subscript
team.cpp:38:106: error: invalid types ‘int[int]’ for array subscript
team.cpp: In function ‘bool compare2(Team, Team)’:
team.cpp:45:39: error: request for member ‘size’ in ‘t1.Team::games’, which is of non-class type ‘const int’
team.cpp:46:39: error: request for member ‘size’ in ‘t2.Team::games’, which is of non-class type ‘const int’
team.cpp:50:17: error: request for member ‘size’ in ‘t1.Team::games’, which is of non-class type ‘const int’
team.cpp:50:35: error: request for member ‘size’ in ‘t2.Team::games’, which is of non-class type ‘const int’
team.cpp:52:24: error: request for member ‘size’ in ‘t1.Team::games’, which is of non-class type ‘const int’
team.cpp:52:43: error: request for member ‘size’ in ‘t2.Team::games’, which is of non-class type ‘const int’
team.cpp: In function ‘bool compare3(Team, Team)’:
team.cpp:62:29: error: passing ‘const Team’ as ‘this’ argument of ‘float Team::getStat3()’ discards qualifiers
team.cpp:63:29: error: passing ‘const Team’ as ‘this’ argument of ‘float Team::getStat3()’ discards qualifiers
In file included from game.cpp:5:0:
game.h:15:96: error: ‘Date’ has not been declared
game.h:24:1: error: ‘Date’ does not name a type
game.h:37:1: error: ‘Date’ does not name a type
game.cpp: In constructor ‘Game::Game()’:
game.cpp:26:3: error: ‘date’ was not declared in this scope
game.cpp:26:15: error: ‘Date’ was not declared in this scope
game.cpp: At global scope:
game.cpp:29:94: error: ‘Date’ has not been declared
game.cpp:29:1: error: prototype for ‘Game::Game(std::string, std::string, int*, int*, int)’ does not match any in class ‘Game’
game.h:10:12: error: candidates are: Game::Game(const Game&)
game.h:15:1: error: Game::Game(std::string, std::string, const int*, const int*, int)
game.cpp:13:1: error: Game::Game()
game.cpp: In member function ‘int Game::getVisitingScore(int) const’:
game.cpp:80:10: error: ‘visitingScores’ was not declared in this scope
game.cpp: At global scope:
game.cpp:94:1: error: ‘Date’ does not name a type

Отредактирую, если понадобятся дальнейшие разъяснения, хотя я не думаю, что это будет.

Любая помощь будет высоко ценится.

0

Решение

Я думаю, что вы неправильно понимаете использование включать охранников.

#ifndef __game_h_
#define __game_h_
// ...
#endif

Набор приведенных выше утверждений обычно используется только в заголовочном файле, описывающем ваши игра интерфейс, чтобы предотвратить многократное включение этого файла заголовка.

Но в своем коде вы добавили защиту заголовка а также реализации, а также вы, кажется, сбиваете с толку сущности — если я не неправильно понимаю содержимое вашего файла — например, в team.h, у вас есть то, что, кажется, включает в себя охранников для игра.

Я предполагаю, что ваше неправильное использование охранников включения вообще не позволяет определить некоторые типы.

Как уже упоминалось, не используйте имена, начинающиеся с двойного подчеркивания.

Как пример, добавьте включите охрану к вашему команда заголовок, чтобы предотвратить многократное включение этого файла, и дать включаемым охранникам имя, которое отражает модуль, который они защищают:

// team.h
#ifndef TEAM_H
#define TEAM_H

// ... code for team.h in here

#endif    // TEAM_H
5

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

Похоже, у вас есть две проблемы: во-первых, вы используете include guard в ваших исходных файлах; во-вторых, неправильный порядок, в котором вы включили ваши файлы.

Сначала включите охрану. Другие уже ответили на этот вопрос, поэтому я буду краток. Защитные заглушки используются только в заголовочных файлах, чтобы предотвратить объявление классов / типов более одного раза. Например, если бы я имел:

«Game.h»:

class Game {};

«Game.cpp»:

#include "game.h"#include "game.h"  // ERROR:  class Game is declared twice.

Чтобы исправить это, я бы использовал include guard в «game.h»:

#ifndef GAME_H_INCLUDED
#define GAME_H_INCLUDED

class Game {};

#endif

При первом включении файла GAME_H_INCLUDED не определяется, поэтому Game объявляется. Второй раз включить GAME_H_INCLUDED является определяется, поэтому объявление пропускается.

Проблема, с которой вы столкнулись, заключается в том, что ваши включенные средства защиты в ваших исходных файлах будут пропускать всю реализацию:

сломанный «game.cpp»:

#include "game.h"#ifndef GAME_H_INCLUDED  //  This is defined in "game.h" so everything will be
//  skipped until #endif is encountered.
#define GAME_H_INCLUDED

//  Implementation of Game class

#endif

Во-вторых, неправильный порядок включения заголовков. Я предполагаю, что у вас есть что-то вроде этого:

«Game.h»

#ifndef GAME
#define GAME

class Game
{
Date mDate;  // Member of type Date, declared in "date.h"};

#endif

«Date.h»

#ifndef GAME
#define GAME

class Date
{
};

#endif

«Game.cpp»

#include "game.h"  // ERROR:  Game relies on the Date class,
//         which isn't included yet
#include "date.h"

Чтобы это исправить, поменяйте местами порядок включений в «game.cpp»:

«Game.cpp»

#include "date.h"#include "game.h"  // Fine, we know what a Date is now.

Или включите «date.h» в «game.h»:

«Game.h»

#include "date.h"#ifndef GAME
#define GAME

class Game
{
Date mDate;  // Member of type Date, declared in "date.h"};

#endif

«Game.cpp»

#include "game.h"  // Still fine, "date.h" is included by "game.h"
1

вам не нужны охранники в ваших файлах c ++

0

Ошибка в том, что вы должны использовать include guard только в ваших заголовочных файлах

Если у тебя есть

BaseClass.h
struct HumanEntity { }

и затем используйте разные классы для использования этого базового класса, без включения защиты вы можете столкнуться с проблемами. Вот почему вы положили

#ifndef __MYGUARD
#define __MYGUARD

... // here is your header code

#endif
0
По вопросам рекламы [email protected]