2012-04-25 4 views
0

이 코드 세그먼트를 실행하려고하면 다음과 같은 오류가 발생합니다. "메뉴의 이름을 지정하지 않습니다."원형 참조와 관련이있는 것을 알고 있지만 내게는 그럴 수 없습니다. 무엇을 알아 내라. 또한 메뉴, 이동 및 관리자가 반복적으로 오류를 제공합니다. 코드 세그먼트는 아래 게시되어 있습니다 :불완전한 유형 C++

#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 
} 

? 오류 메시지 :

In file included from go.h:13:0, from manager.h:33, from manager.cpp:2: menu.h:28:11: error: field ‘mng’ has incomplete type

+0

표면이 정상적으로 보입니다. 오류를 일으키는 코드가 맞습니까? – juanchopanza

+0

실제로 다른 유사한 오류가 발생하여 코드가 게시됩니다. –

+1

menu.h가 어떻게 든 go.h를 참조 할 수 있습니까? 이런 종류의 오류가 발생할 수 있습니다. – Benj

답변

2

manager.h가 이제까지 class Manager의 정의에 도달하기 전에

class Menu

정의되고 manager.h 포함 menu.h 포함 go.h을 포함 ....

그러나 class MenuManager을 필요로하지만 컴파일러는 Manager에 대해 알지 못하기 때문에 아직 만들 수있는 방법을 알지 못합니다.

당신은 class Manager를 선언 전달하고 Menumng 구성원으로 만들 수있는 포인터 또는 참조 :

class Manager; 

class Menu { 
    ... 
    Manager* mng; 

    // or this: 
    //Manager& mng; 
    ... 

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

+0

go.h에서 #include menu.h를 제거하여 제거 할 수 있습니까? - 그러나 각 클래스에는 포함 된 클래스의 객체가 필요합니다. –

+0

고마워, 내가 이해 한 것 같아 . –

1

그것은 당신이 당신의 Manager 클래스의 선언의 끝에 세미콜론을 누락이 나타납니다 에서 manger.h.

또한 포함 보호를 닫기 위해 #endif이 누락되었습니다.

+0

오, 네, 그 점을 발견하지 못했습니다, 그건 역시 문제입니다. – Benj

+0

그것이 전체 소스 파일이라고 가정합니다. – Benj

+0

아니요, 실제 파일에 있습니다. –