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并使指针或引用的mng成员:Menu

class Manager;

class Menu {
    ...
    Manager* mng;

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

这是对循环引用以及如何修复它们的一个很好的解释。

于 2012-04-25T19:48:47.563 回答
1

Manager看来您在 manger.h中的类声明末尾缺少分号。

你也错过了#endif关闭你的包含后卫。

于 2012-04-25T19:55:27.087 回答