C++ trying to use #ifndef and #include statements

CalvinCopyright picture CalvinCopyright · Sep 13, 2012 · Viewed 13.8k times · Source

Ok, so I'm a HTML/Javascript/PHP professional, but I'm trying to learn C++. I'm still a newbie at it, and I have a C++ programming project that I have errors with.

The file that contains int main() is 'football.cpp', and I have .h and .cpp files for three classes that I have to use: Game, Team, and Date. Each instance of Team contains a vector of Games, and each Game contains a Date. Date does not contain instances of any other class.

I am trying to find a way to use #include and #ifndef statements at the tops of the files so that I don't get errors when I compile, but I haven't found a combination that works. I am not sure if there are other bugs. Here's my current #include sections, not counting other libraries:

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"

I use Cygwin g++ compiler, and the line I use to compile it is:

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

Here are all the errors I get: (WARNING, WALL OF TEXT)

$ 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


Will edit if further clarification is needed, although I don't think it will be.

Any help would be vastly appreciated.

Answer

pb2q picture pb2q · Sep 13, 2012

I think that you're misunderstanding the use of include guards.

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

The set of statements above would typically be used only in the header file describing your game interface, to prevent multiple-inclusion of that header file.

But in your code, you've added include guards to header and implementation, and also you seem to be confusing entities - unless I'm misunderstanding your file contents - for instance in team.h, you have what appear to be include guards for game.

My guess is that your misuse of include guards is actually preventing some types from being defined at all.

As others have mentioned, don't use names beginning with double underscores.

As an example, add include guards to your team header to prevent multiple-inclusion of that file, and give the include guards a name that reflects the module that they're guarding:

// team.h
#ifndef TEAM_H
#define TEAM_H

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

#endif    // TEAM_H