所以,我有两个班级...结构非常基础。我尝试将一个导入到另一个,并声明该类类型的新对象...但是,它似乎将类名称作为变量的名称读取?!
下面提供的标题类不会正确读取“ApplicationManager”类。 代码:
####ifndef _GAME_H_
####define _GAME_H_
####include "application.h"
####include "applicationmanager.h"
class Game : public Application
{
public:
Game();
~Game();
void LoadContent() override;
void UnloadContent() override;
void Draw() override;
private:
//int ApplicationManager; //WHY DOES THIS COMPILE??!
ApplicationManager management; //This DOES NOT WORK?
};
####endif
这是“ApplicationManager”类的标题。 代码:
####ifndef _APPMANAGER_H_
####define _APPMANAGER_H_
####include "game.h"
####include "application.h"
class ApplicationManager
{
public:
ApplicationManager(void);
~ApplicationManager(void);
private:
};
####endif
发生的错误告诉我,我需要一个“;”在“管理”之前,并且“ApplicationManager”缺少类型说明符,因此假定它是默认类型int。
...为什么它不能正确编译的任何想法?其他人可以尝试这个并报告结果吗?我复制了代码,并将其粘贴到另一个解决方案中,看看是否有东西被破坏了......它仍然没有用。
答案 0 :(得分:8)
你有一个循环引用。当game.h
中包含applicationmanager.h
时,编译器尚未读取ApplicationManager
类。
要修复,请删除该行
#include "game.h"
来自applicationmanager.h
。
答案 1 :(得分:2)
为什么Game.h
和AppicationManager.h
之间存在循环依赖关系?
除此之外,我会在#ifdef _*_H
中检查您的标题后卫(Application.h
)。在复制/粘贴代码或复制文件时,C ++中经常出现的情况是忘记更改新类的标题保护定义名称,因此最终会有两个不同的标题由同一个定义保护。在这种情况下,如果两者都包含在其他文件中,则只有第一个实际上会扩展为任何有用的文件。
答案 2 :(得分:1)
错误信息是误导性的。它基本上说“出于某种原因(可能是引用类型中的错误)我无法识别您正在使用的类型(在您的情况下是ApplicationManager)”。 如果你需要ApplicationManager知道Game制作一个纯虚拟基类(其他术语的接口)并让Game继承(不扩展接口)并让ApplicationManager包含基类头文件