0

さて、私はHTML / Javascript / PHPの専門家ですが、C++を学ぼうとしています。私はまだ初心者で、エラーのあるC++プログラミングプロジェクトがあります。

int main()を含むファイルは'football.cpp'であり、使用する必要のある3つのクラス(Game、Team、およびDate)の.hファイルと.cppファイルがあります。チームの各インスタンスにはゲームのベクトルが含まれ、各ゲームには日付が含まれます。Dateには、他のクラスのインスタンスは含まれていません。

コンパイル時にエラーが発生しないように、ファイルの先頭で#includeステートメントと#ifndefステートメントを使用する方法を見つけようとしていますが、機能する組み合わせが見つかりません。他にバグがあるかどうかはわかりません。これが私の現在の#includeセクションであり、他のライブラリは数えていません。

サッカー.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"

私はCygwing++コンパイラを使用しており、コンパイルに使用する行は次のとおりです。

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


さらに明確にする必要がある場合は編集しますが、そうなるとは思いません。

どんな助けでも大歓迎です。

4

4 に答える 4

6

インクルードガードの使い方を誤解していると思います。

#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
于 2012-09-13T15:17:31.143 に答える
1

ここには2つの問題があるようです。1つは、ソースファイルにインクルードガードを使用していることです。2つ目は、ファイルを含めた順序が間違っていることです。

まず、警備員を含めます。他の人はすでにこの質問に答えているので、簡単に説明します。インクルードガードは、クラス/タイプが複数回宣言されるのを防ぐために、ヘッダーファイルでのみ使用されます。たとえば、私が持っていた場合:

"game.h"

class Game {};

"game.cpp"

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

これを修正するには、「game.h」にインクルードガードを使用します。

#ifndef GAME_H_INCLUDED
#define GAME_H_INCLUDED

class Game {};

#endif

初めてファイルがインクルードされるとき、GAME_H_INCLUDEDは定義されていないため、Gameが宣言されます。2回目にインクルードされると、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.

または、「game.h」に「date.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"
于 2012-09-13T16:42:50.623 に答える
0

C++ファイルにガードは必要ありません

于 2012-09-13T15:17:07.613 に答える
0

エラーは、ヘッダーファイルでのみインクルードガードを使用する必要があるということです

あなたが持っている場合

BaseClass.h
struct HumanEntity { }

次に、さまざまなクラスにその基本クラスを使用させます。インクルードガードがないと、問題が発生する可能性があります。だからあなたは

#ifndef __MYGUARD
#define __MYGUARD

... // here is your header code

#endif
于 2012-09-13T15:21:48.287 に答える