0

基本的に私のクラスのレイアウトは次のとおりです。

GameDriver.h:

#ifndef GAMEDRIVER_H
#define GAMEDRIVER_H
#include "CameraSystem.h"

class CameraSystem; //Forward declaration

class GameDriver {
    //Stuff
};

#endif

CameraSystem.h:

#ifndef CAMERASYSTEM_H
#define CAMERASYSTEM_H
#include "Tickable.h"

class GameDriver;
class CameraSystem: public Tickable { //Complains here
    //Stuff
};

#endif

Tickable.h:

#ifndef TICKABLE_H
#define TICKABLE_H
#include "GameDriver.h"
class GameDriver;
class Tickable {
    //Stuff
};

#endif

これが私が得るエラーです:

CameraSystem.h:9 error: expected class-name before '{' token

Tickable の前方宣言も機能しません。何か助けはありますか?前もって感謝します。

4

5 に答える 5

3

クラスを転送する場合は、クラスのヘッダーを含めないでください。

#include "CameraSystem.h" // DO NOT INCLUDE THIS

class CameraSystem; //Forward declaration

class GameDriver {
    //Stuff
};
于 2012-08-12T18:45:17.220 に答える
1

わかりました、ここに 2 つの問題があります。

最初:前方宣言は役に立たない。あなたが書いている (例として GameDriver.h: を使用):

#include "CameraSystem.h"

class CameraSystem; //Forward declaration

class GameDriver {
    //Stuff
};

ここで CameraSystem は CameraSystem.h をインクルードすることで既に認識されているため、前方宣言はナンセンスです。あなたが書くつもりだったのは:

class CameraSystem; //Forward declaration

class GameDriver {
    //Stuff
};

2番目:前方宣言されたクラスから派生できないため、実際に前方宣言が必要な場合は使用できません。

#include "Tickable.h"

class CameraSystem: public Tickable { //Complains here
    //Stuff
};

前方宣言は、前方宣言されたクラスをクラス メンバーとして直接使用していない場合にのみ機能することに注意してください。その後、前方宣言されたクラスへのポインターまたは参照に制限されます。この理由は、クラスのメモリ レイアウトが完全にわかっていない限り (つまり、ヘッダー ファイルをインクルードすることによって)、コンパイラがクラスのメモリ レイアウトを認識できないためです。例えば:

class CameraSystem;
class GameDriver {
  CameraSystem m_cameraSystem;
};

動作しませ。でも、

class CameraSystem;
class GameDriver {
  CameraSystem *m_cameraSystem;
  CameraSystem& m_otherCameraSystem;
};

意思。もちろん、*.cpp ファイルに正しいヘッダー ファイルを含める必要があります。

于 2012-08-12T18:49:23.120 に答える
0

このような循環依存関係を解決することはできません。しかし、あなたは(部分的に)解決策を持っています:

つまり、ヘッダーを含める代わりに、前方宣言を使用します。これを正しく行えば、問題は発生しないはずです。ただし、プログラムを論理要素/グループにグループ化し、必要な場合にのみ相互参照を追加してください(たとえば、ゲームはカメラを認識してアクセスする必要がありますが、カメラはゲームシステムにアクセスする必要はありません。全体)。

于 2012-08-12T18:47:30.120 に答える
0

宣言されていないクラスから継承することはできません。

前処理Tickable.hにより、次のことが得られます。

class GameDriver;
class CameraSystem: public Tickable { //Complains here
    //Stuff
};

class CameraSystem; //Forward declaration

class GameDriver {
    //Stuff
};

class GameDriver;
class Tickable {
    //Stuff
};

Tickable継承するときに、前方宣言されていないことを確認してください。

于 2012-08-12T19:07:17.270 に答える
-2

#pragma once各ヘッダーファイルの最初に追加してみてください。

どういうわけか、それらを1回だけ置くようにコンパイラーに指示する必要があります。それが1つの方法です。もう1つはとを使用#ifndef Xして#define Xいます。

これで解決しない場合は、循環依存を排除​​してみてください-発生する必要はないようです...

于 2012-08-12T18:43:25.033 に答える