2

私のプログラムでは、「invader.h」と「game.h」という名前の2つのヘッダーファイルを取得しました。game.hにinvader.hを含めます。これは、現在のゲームインスタンスのポインターをinvaderインスタンスに渡したいためです。invader.hにもgame.hを含めましたが、コンパイルエラーが発生しました。invader.hからgame.hを削除すると、正常に動作します。各ヘッダーファイルにインクルードガードをすでに追加しました。これまでに見つけたものに基づいて、invader.hにゲームクラスの前方宣言を追加しました。必要なのは、invader.hのゲームインスタンスへのポインターだからです。しかし、invader.cppでゲームの関数を呼び出したい場合、不完全なクラス型へのポインターは許可されていないと表示されます。この問題を解決するにはどうすればよいですか?

Game.h

#ifndef GAME_H
#define GAME_H
#include "Tank.h"
#include "Invader.h"
#include "Block.h"
#include "Bullet.h"

class Game
{
private:
Tank tank;
Invader invaders[11][5];
Block blocks[4];
bool logicRequiredThisLoop = false;
public:
Game();
void initEntities();
Tank* getTank(){return &tank;};
Invader* getInvaders(){return &invaders[0][0];};
Block* getBlocks(){return &blocks[0];};
void updateLogic();
};
#endif

Invader.h

#ifndef INVADER_H
#define INVADER_H
#include "Entity.h"
class Game; //forward declaration of class Game
class Invader: public Entity
{
private:
Game* game;
public:
Invader(){};
Invader(Game*,char*,int,int,int,int,int,int);
void move(long delta);
void doLogic();
};
#endif

Invader.cpp

#include "Invader.h"
Invader::Invader(Game* game,char* sprite,int x,int y,int dx,int dy,int width,int height):Entity(sprite,x,y,dx,dy,width,height)
{
this->game = game;
}

void Invader::move(long delta)
{
if ((dx<0)&&(x<=10))
{
    game->updateLogic();
}
if ((dx>0)&&(x>=390))
{
    dx = -dx;
    y -= dy;
}

x+=dx;
}

Invader.cppで、Gameクラスのメンバー関数であるupdateLogic()を呼び出そうとすると、不完全なクラスへのポインターが許可されていないというエラーが発生します。

実際、ここで知りたい最も基本的なことは、次のとおりです。私のコードでは、Gameクラスに侵入者タイプのメンバー変数があるので、侵入者クラスでGameクラスのメンバー関数を呼び出すにはどうすればよいですか?li、eInvaderを含めると言いましたGame.hに.hがあり、Invader.hにGameh.hが含まれていると、コンパイルエラーが発生します。

これは、Game.hをInvader.hに含めると得られるものです。

1>ClCompile:
1>  Invader.cpp
1>c:\users\tony\documents\info3220\spaceinvader\spaceinvader\basicwogl\game.h(13): error C2146: syntax error : missing ';' before identifier 'invaders'
1>c:\users\tony\documents\info3220\spaceinvader\spaceinvader\basicwogl\game.h(13): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>c:\users\tony\documents\info3220\spaceinvader\spaceinvader\basicwogl\game.h(13): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>c:\users\tony\documents\info3220\spaceinvader\spaceinvader\basicwogl\game.h(21): error C2143: syntax error : missing ';' before '*'
1>c:\users\tony\documents\info3220\spaceinvader\spaceinvader\basicwogl\game.h(21): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>c:\users\tony\documents\info3220\spaceinvader\spaceinvader\basicwogl\game.h(21): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>c:\users\tony\documents\info3220\spaceinvader\spaceinvader\basicwogl\game.h(21): warning C4183: 'getInvaders': missing return type; assumed to be a member function returning 'int'
1>c:\users\tony\documents\info3220\spaceinvader\spaceinvader\basicwogl\game.h(21): error C2065: 'invaders' : undeclared identifier
4

2 に答える 2

1

この問題を解決するにはどうすればよいですか?
まず、不完全なタイプの意味を理解します。

不完全なタイプにつながるものは何ですか?

タイプが不完全なタイプでないと前方宣言を使用できない場合は、何かが間違っているため、デザインを再検討する必要があります。

より詳細な回答が必要な場合は、ソースコードを提供する必要があります。

編集:
含める必要があります。Game.hInvader.cpp

//Invader.cpp

#include "Invader.h"
#include "Game.h"
于 2012-04-19T02:46:22.110 に答える
0

これについては、現在ローカルボックスにある2つのファイルを参照して説明します。

server.hworker.h

server.h:

#ifndef SERVER_H_
#define SERVER_H_

typedef struct _conf conf;
typedef struct _worker worker;
typedef struct _logger logger;

typedef struct _server server;
struct _server {
    /* config */
    conf *cfg;

    /* socket */
    int fd;
    struct event_base *base;
    struct event *signal;

    /* workers */
    worker **w;

    /* log */
    logger *log;
};
...
...
#endif /* SERVER_H_ */

worker.h

#ifndef WORKER_H_
#define WORKER_H_

#include <pthread.h>

typedef struct _server server;

typedef struct _worker worker;
struct _worker {
    pthread_t t;

    struct event_base *base;
    struct evhttp *http;

    server *s;
};
...
...
#endif /* WORKER_H_ */

ご覧のとおり、サーバー構造体とワーカー構造体の両方が相互に参照を作成します。これは、.hファイルの先頭にある前方宣言によって解決されます。

typedef struct _worker worker; 

上部にあるのserver.hは、ワーカー構造体を参照するのに十分です。https://github.com/abhinavsingh/pulsar/tree/master/includeでさらに参照できるように、完全なファイルを確認することをお勧めします。

お役に立てば幸いです。

于 2012-04-19T02:42:02.133 に答える