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....
(欠陥のある)オリジナルと思われるものに近似する擬似コードではなく、実際のコードの詳細を教えてください。実際のコードに含まれるすべての微妙なエラーは伝播されません。 –
@Adam:実際には動作するテストケースが優れています。 私は彼のコードをすべて読まない。 –