Предварительная декларация: неопределенный класс (C2079)

У меня есть ошибка в моем коде. На всех форумах написано «в этой ситуации используйте Forward декларации». Я попробовал это, и это не работает.

ошибка C2079 Credit :: mainMenu использовать класс MainMenu не объявлен (перевод с французского)

Я изменил класс, чтобы быть конкретным для вопроса.

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 (Eсть credit.hpp но я не использую переменную сейчас)
после mainmenu.h (есть также mainmenu.hppя не использую переменную сейчас)

совет: Menu класс не включает ни одного из этих классов

Я могу выслать вам полный код, если вы хотите

Спасибо в адвенсе!

0

Решение

Эта проблема известна как круговая зависимость. Короче говоря, два объекта должны никогда иметь другой в качестве своего подобъекта.

Вместо этого у вас есть два варианта. Один должен иметь один точка другому

class Credit : public Menu
{
private:
MainMenu* mainMenu;
};

Или у вас может быть своего рода менеджер, где только менеджер знает об обоих объектах и ​​позволяет им взаимодействовать через менеджера.

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

По технической причине, почему вы не можете иметь член объявленного, но не определенного типа, потому что это неполный тип, и вы не можете иметь объект неполного типа.

1

Другие решения

Других решений пока нет …