前瞻声明:未定义的类别(C2079)

时间:2017-07-31 10:58:19

标签: c++ forward-declaration c2079

我的代码中有错误。所有的论坛都说“在这种情况下,使用Forward Declaration"。我尝试了这个并且它不起作用。

错误 C2079 Credit :: mainMenu使用未声明的MainMenu类(翻译自法语)

我修改了classe以特定于问题。

main.cpp

#include <SFML/Graphics.hpp>

#include "Menu.h"

#include "credit.h"
#include "mainmenu.h"


MainMenu *mainMenu = new MainMenu();//works here

int main(){
    return 0;
}

credit.h

#ifndef DEF_CREDIT
#define DEF_CREDIT

#include <SFML/Graphics.hpp>
#include "Menu.h"
class MainMenu;


class Credit : public Menu
{
private:
    MainMenu mainMenu = MainMenu();//DON'T WORK HERE
};

#endif

mainmenu.h

#ifndef DEF_MAINMENU
#define DEF_MAINMENU

#include <SFML/Graphics.hpp>
#include "Menu.h"
#include "credit.h"

class MainMenu :public Menu
{
private:
    Credit credit = Credit();//work
};
#endif

拳头我加载main.cpp 在credit.h之后(有一个credit.hpp但我现在不使用该变量) 在mainmenu.h之后(还有mainmenu.hpp,我现在不使用变量)

提示:Menu课程不包括任何该课程

如果你想要我可以发给你完整的代码

感谢advence!

1 个答案:

答案 0 :(得分:1)

此问题称为circular dependency。长话短说,两个对象应该从不将另一个对象作为其子对象。

相反,您有两种选择。一种是将与另一个

连接起来
class Credit : public Menu
{
private:
    MainMenu* mainMenu;
};

或者,你可以有一个经理,只有经理知道这两个对象,让他们通过经理进行互动

class Manager
{
private:
    Credit credit;
    MainMenu mainMenu;
};

由于技术原因,您不能拥有声明但未定义类型的成员,因为它是一个不完整的类型,并且您不能拥有类型不完整的对象。