1

このコードセグメントを実行しようとすると、次のエラーが発生します。「メニューはタイプに名前を付けていません」。循環参照と関係があることはわかっていますが、私の人生では何を理解できません。また、menu、go、およびmanagerは繰り返しエラーを出します。コードセグメントは以下に掲載されています:

#ifndef GO__H
#define GO__H

#include <SDL.h>
#include <iostream>
#include <string>
using std::cout; using std::endl; 
using std::string;

#include "ioManager.h"
#include "gui.h"
#include "clock.h"
#include "menu.h"

//class Menu;
class Go {
public:
    Go ();
    void play();
private:
    SDL_Surface *screen;
    Gui gui;
    Menu menu;

    void drawBackground() const;
    Go(const Go&);
    Go& operator=(const Go&);
};

#endif

ここにメニューがあります:

#ifndef MENU_H
#define MENU_H

#include <SDL.h>
#include <iostream>

#include "ioManager.h" 
#include "gui.h"
#include "clock.h"
#include "manager.h"

class Menu {
public:
    Menu ();
    void play();

private:
    const Clock& clock;
    bool env;

    SDL_Surface *screen;
    Gui gui;
    Manager mng;

    void drawBackground() const;
    Menu(const Menu&);
    Menu& operator=(const Menu&);
};

#endif

マネジャー :

#ifndef MANAG_H
#define MANAG_H

#include "go.h"
class Manager { 
  Go go;
  //other code
}

問題がどこにあるかわかりますか?エラーメッセージ:

go.h:13:0、manager.h:33、manager.cpp:2からインクルードされたファイル:menu.h:28:11:エラー:フィールド'mng'のタイプが不完全です

4

2 に答える 2

3

manager.h含む 含むgo.h含むmenu.h含むmanager.h...

class Menu、 の定義に到達する前に定義されていますclass Manager

ただし、class Menuが必要Managerですが、コンパイラはManagerまだ知らないため、それをどれだけ大きくするかわかりません。

ポインターまたは参照のメンバーを前方宣言class Managerして作成することができます。mngMenu

class Manager;

class Menu {
    ...
    Manager* mng;

    // or this:
    //Manager& mng; 
    ...

ここでは、循環参照とその修正方法について説明します。

于 2012-04-25T19:48:47.563 に答える
1

Managermanger.hでのクラスの宣言の最後にセミコロンがないようです。

#endifインクルードガードを閉じるためのもありません。

于 2012-04-25T19:55:27.087 に答える