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