2009-03-25 4 views
0

main.cppに加えて、3つのヘッダーファイルと3つの.cppファイルを使用するプログラムがあります。 VC++ 2008を使用しています。ファイルの依存関係は何が問題がありますか?

ここに設定があります。 3つのヘッダーはすべて#ifndef HEADERNAME_Hなどで保護されています。また、3つのヘッダーにはそれぞれ対応する.cppファイルがあり、それぞれのヘッダーが#​​includeされます。

/* main.cpp */ 
    #include "mainHeader.h" 

/* mainHeader.h */ 
    #include <windows.h> 
    #include <iostream> 
    //Others... 
    #include "Moo.h" 

/* Moo.h */ 
    #include "mainHeader.h" 
    #include "Foo.h" 

    class Moo { 
     private: 
     int varA; 
     Foo myFoo1; 
     Foo myFoo2; 
     Foo myFoo3; 

     Public: 
     void setVarA(int); // defined in Moo.cpp 
     //etc 
    }; 

/* Foo.h */ 
    #include "mainHeader.h" 
    class Foo { ... }; 

私はMoo.hの3つのFooの内部インスタンス化するためのコンパイルエラーを取得しています:私はFooのを含め '武:: setVarA' 未定義のクラスを使用しています 'フー'

エラーC2079を.h、それはどうして未定義ですか?これはFoo.hを含む唯一のファイルです。私はFooを 'class Foo;'を宣言して宣言しようとしました。クラスMooの宣言の前に。

また、Foo.hファイルにも#defineがあり、Moo.hで使用するとコンパイラエラーが発生します。 (宣言されていない識別子エラーC2065)。

Moo.hは定義されている/宣言されているものが見つからないため、Foo.hが含まれていないようです。どうしたの?

私の実際のコードは長いですが、ここであなたは(それがところでマリオプラットフォーマーゲームです)行く:

これはfoo.hということになります。

//************************** 
// Animation.h 
//************************** 
// Header to Animation class 

#ifndef ANIMATION_H 
#define ANIMATION_H 

#include "../Headers/MarioGame.h" 

#define MAX_ANIMATIONS 58 

extern char* fileAnimations[MAX_ANIMATIONS]; 
extern char marioAnims[MAX_ANIMATIONS][3000]; 
extern char background [3700000]; 

class Animation 
{ 
private: 
    int imageCount; 

public: 
    DWORD lastAnimTick; 
    int lastAnim; 
    int anims[4][2]; 
    DWORD animsTime[4]; 

    // Constructor 
    Animation(); 

    // Mutators 
    void addImage(int left, int right, DWORD time); 
    void defaultAnimation(); 

    // Accessors 
    int getImage(bool facingLeft); 
    int getImageCount(); 
    int getCurLoc(); 
}; 

#endif // ANIMATION_H 

これは「Moo.h.」になります

//************************** 
// MarioGame.h 
//************************** 
// Header to MarioGame functions 
// Contains Includes, Defines, Function Declarations, Namespaces for program 

#ifndef MARIOGAME_H 
#define MARIOGAME_H 

//*===================== 
// Defines 
//*===================== 
#define WINDOWED  0     // predefined flags for initialization 
#define FULLSCREEN  1 

#define WNDCLASSNAME "MarioGame"   // window class name 
#define WNDNAME   "Mario Game"  // string that will appear in the title bar 

#define NUM_OF_KEYS  5 
#define KEY_SPACE  0 
#define KEY_UP   1 
#define KEY_DOWN  2 
#define KEY_RIGHT  3 
#define KEY_LEFT  4 
#define KEY_CONTROL  5 

#define GRIDW   2.0f 
#define GRIDH   2.0f 

#define PATHING_SIZE 33 

//*===================== 
// Includes 
//*===================== 
#include <windows.h> 

#include <gl/gl.h> 
#include <gl/glu.h> 

#include <iostream> 
#include <fstream> 
#include <vector> 
#include <math.h> 
#include <WAVEMIX.H> 

#include "../Console/guicon.h" 
#include "../Headers/Mario.h" 



//*===================== 
// Function Declarations 
//*===================== 
LRESULT CALLBACK WinProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam); 
HWND createWindow(HINSTANCE &hinst, int width, int height, int depth); 

void renderFrame(); 
void think(); 
void loadTextures(); 
void WMInit(HINSTANCE, HWND); 

void resize (int width, int height); 
void shutdown(); 

void keyLeft(bool); 
void keyRight(bool); 
void keySpace(bool); 
void keyDownArrow(bool); 

bool checkBoundary(float, float); 
void onPlayerDeath(); 

class Mario; 

//*===================== 
// Namespaces 
//*===================== 

using namespace std; 

//*===================== 
// Global Variable Declarations 
//*===================== 
extern Mario Player; 

extern HDC hdc; 
extern HGLRC hglrc; 
extern HWND hwnd; 

extern int SCRW; 
extern int SCRH; 
extern int SCRD; 

extern DWORD oldTick; 
extern DWORD oldTick2; 
extern DWORD oldPTime; 

extern float pixelZoom; 

extern float screenPosX; 
extern float screenPosY;   

extern float playerScrollMultiplier;  

extern float playerTerminalWalkVel; 
extern float playerWalkAccel;  

extern float playerRunAccel;    
extern float playerTerminalRunVel; 

extern float playerDecel; 

extern float playerPVel; 
extern DWORD playerPRunAchieveTime;  

extern float playerJumpUpVel; 
extern float playerJumpTime; 

extern float gravityAccel; 
extern float playerTerminalFallVel; 

extern float playerTerminalGlideFallVel; 


extern bool keyDown[NUM_OF_KEYS]; 
extern bool lastSpace;   

extern bool drawPathingMap;    

extern float pathing [PATHING_SIZE][5][2];  

#endif   // MARIOGAME_H 

ここmain.cppにあります:

//************************** 
// main.cpp 
//************************** 
// Primary implementation file; handles Win32 interface 


#include "../Headers/MarioGame.h" 
//*===================== 
// WinMain 
//*===================== 
int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hprevinstance, LPSTR lpcmdline, int nshowcmd) 
{ 
    ... 
} 

//And other functions.... 
+0

(欠陥のある)オリジナルと思われるものに近似する擬似コードではなく、実際のコードの詳細を教えてください。実際のコードに含まれるすべての微妙なエラーは伝播されません。 –

+0

@Adam:実際には動作するテストケースが優れています。 私は彼のコードをすべて読まない。 –

答えて

2

あなたが前方を必要とする

//************************** 
// Mario.h 
//************************** 
// Header to Mario class 

#ifndef MARIO_H 
#define MARIO_H 

#include "../Headers/MarioGame.h" 
#include "../Headers/Animation.h" 

enum { MARIO_TYPE_SMALL, 
     MARIO_TYPE_BIG, 
     MARIO_TYPE_LEAF }; 

class Animation; 

class Mario 
{ 
private: 
    #pragma region Variable Declarations 
     float xPos; 
     float yPos; 

     float xVel; 
     float yVel; 

     float lastXVel; //used for determining when walk/run decceleration is complete 

     float xAccel; 
     float yAccel; 

     float xSize; 
     float ySize; 

     float halfW; 
     float halfH; 

     bool grounded; 
     bool walking; 
     bool running; 
     bool pRunning; 
     bool jumping; 
     bool hunching; 
     bool gliding; 
     bool flying; 
     bool decelerating; 
     int facing; 

     DWORD pRunTimer; 
     int pChargeLevel; 

     DWORD jumpStart; 

     DWORD glideStart; 

     int type; 

     bool updateXMovement; 
     bool updateYMovement; 

     bool screenUpLock; 

     char marioAnims[MAX_ANIMATIONS][3000]; 

     Animation smallStand; 
     Animation smallWalk; 
     Animation smallRun; 
     Animation smallPRun; 
     Animation smallJump; 
     Animation smallSkid; 

     Animation bigStand; 
     Animation bigWalk; 
     Animation bigRun; 
     Animation bigPRun; 
     Animation bigJump; 
     Animation bigSkid; 
     Animation bigHunch; 

     Animation leafStand; 
     Animation leafWalk; 
     Animation leafRun; 
     Animation leafPRun; 
     Animation leafJump; 
     Animation leafSkid; 
     Animation leafHunch; 
     Animation leafTailWhack; 
     Animation leafGlide; 
     Animation leafFly; 
     Animation leafFalling; 

     Animation* lastAnim; 
    #pragma endregion 

public: 
    //Constructor 
    Mario(); 

    //Mutators 
    void setGlideStart(DWORD g); 
    void setHunching(bool h); 
    void setGliding(bool g); 
    void setFlying(bool f); 
    void setType(int t); 
    void setPChargeLevel(int c); 
    void setPRunTimer(DWORD t); 
    void setScreenUpLock(bool s); 
    void setUpdateXMovement(bool m); 
    void setUpdateYMovement(bool m); 
    void setDecelerating(bool d); 
    void setPos(float x, float y); 
    void setVel(float x, float y); 
    void setAccel(float x, float y); 
    void setSize(float x, float y); 
    void setJumping(bool j); 
    void setJumpStart(DWORD s); 
    void setGrounded(bool g); 
    void setWalking(bool w); 
    void setRunning(bool r); 
    void setPRunning(bool r); 
    void setLastXVel(float l); 
    void setFacing(int f); 
    void defaultAnimations(); 

    //Accessors 
    DWORD getGlideStart(); 
    bool getHunching(); 
    bool getGliding(); 
    bool getFlying(); 
    int getType(); 
    int getPChargeLevel(); 
    DWORD getPRunTimer(); 
    bool getScreenUpLock(); 
    bool getUpdateXMovement(); 
    bool getUpdateYMovement(); 
    bool getDecelerating(); 
    float getXPos(); 
    float getYPos(); 
    float getXVel(); 
    float getYVel(); 
    float getXAccel(); 
    float getYAccel(); 
    bool getJumping(); 
    DWORD getJumpStart(); 
    float getXSize(); 
    float getYSize(); 
    float getHalfW(); 
    float getHalfH(); 
    bool getGrounded(); 
    bool getWalking(); 
    bool getRunning(); 
    bool getPRunning(); 
    float getLastXVel(); 
    int getFacing(); 
    int getAnimation(); 
}; 

#endif // MARIO_H 

これは "mainHeader.h" は次のようになります。多くの民間アニメーションのメンバー、すべての原因となるエラーは注意してくださいクラスFooの宣言。詳細は、「Effective C++、Third Edition」の第31項を参照してください。注意:Fooを宣言すると、クラスMooはFoo型のポインタしか持てないことを意味します。何かがfoo.hのが含まれている場合、これは何が起こるかである

(矢印は、依存関係を表示する):

がfoo.h --includes - > mainHeader.h --includes - > Moo.h --includes- - > foo.hという

クラス武第二がfoo.hが原因あなたの警備員に含まれていない指定された場合には、mainheader.h

+0

まず、前方宣言やポインタなしでこれを行うことは可能ですか?実際のクラスは? 次に、Moo.hで見つからないFoo.hの#defineについてはどうですか? –

+0

Moo.hの前にFoo.hが常に含まれていることを確認できれば、問題はないはずです。あなたの例はFoo.hを含むMoo.hのみを示していますが、これは当てはまりません。他の人が示唆しているように、失敗したより完全な例を投稿してください。 – Trent

+0

問題がありましたが、それを見たのはプリプロセッサのダンプファイル(Dan Olsenに感謝)でした。 –

2

含む後に発生するので、また、Fooクラスがまだ宣言されていないことに注意してくださいこれらの種類の状況をデバッグするための最良のツールは、コンパイラの「ファイルへの前処理された出力のダンプ」オプションです。これを有効にすると、すぐに問題が発生する可能性が高くなります。使用可能にする方法については、コンパイラー・オプションを調べてください。

+0

大きなヒント、これは私が問題を見るのを助けました。 –

0

注意すべきもう一つの問題は、 'using namespace'ステートメントの使用です。ヘッダファイルでこれらを使用しないでください。

これは、多数の異なるヘッダーファイルを含むモジュールのあいまいさを避けるためです。

だから、そうでなければ、std :: vector、std :: listなどの多くを行う必要があります。

関連する問題