不完整的C ++类型

时间:2012-04-25 19:26:39

标签: c++ circular-reference

当我尝试执行此代码段时出现以下错误:“菜单没有命名类型”。我知道它与循环引用有关,但对于我的生活,我无法弄清楚是什么。此外,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'类型不完整

2 个答案:

答案 0 :(得分:2)

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; 
    ...

Here's a good explanation of circular references and how to fix them.

答案 1 :(得分:1)

在manger.h中Manager类的声明结尾处显示您缺少分号。

您也错过#endif来关闭包含警卫。