2017-04-04 1 views
0

클래스 내에서 다른 파일에 정의 된 구조체를 가리킬 수 있습니까?다른 파일에 정의 된 구조체에 대한 포인터

cannot convert 'main()::list*' to 'entry::list*' in assignment

MAIN.CPP :

#include "entry.h" 
#include <vector> 

int main() 
{ 

struct list 
{ 
    std::vector<entry*> entryVector; 
    int temp; 
}; 

list A; 
entry B; 

B.ptrToStruct = &A; 


return 0; 
} 

entry.h :

#ifndef ENTRY_H 
#define ENTRY_H 
#include <string> 

class entry 
{ 
public: 

    struct list; //prototype does not work 

    std::string text; 
    struct list* ptrToStruct; 

}; 

#endif // ENTRY_H 

나는 또한에 시도

나는 아래의 코드처럼 그것을 시도하지만이 오류가 다음과 같이 프로토 타입을 작성하십시오 :

struct main::list; 

"main '이 (가) 선언되지 않았기 때문에 작동하지 않았습니다.

+2

먼저 용어에 대해 약간주의하십시오. * 프로토 타입 *은 함수의 전방 선언입니다. 'entry' 클래스에서 여러분이하고있는 일은 단순히'entry :: list' 클래스를 선언하는 것입니다. 그런 다음 문제에 대해 : 아니오, 다른 범위의 함수에서 로컬로 선언 또는 정의 된 기호에 액세스 할 수 없습니다. –

+1

BTW, 항목이 서로 상호 연결되는 것이 약간 이상합니다. 각'entry'가'list'에 의해 소유된다면, 왜 그것이 속해있는 목록을 추적해야합니까? 항목을 추가하고 제거하는 것은 매우 복잡 할 것입니다. –

+0

설정 메뉴 용입니다. 항목은 런타임 중에 변경되지 않습니다. 해당 메뉴 항목의 하위 메뉴를 가리 키도록 ptrToStruct가 필요합니다. 내 구조체는 항목의 벡터를 보유하고있는 나의 목록입니다. 이러한 항목 중 일부에는 하위 목록이 있습니다. 그게 왜 포인터가 필요한지. 구조체는 또한 선택된 항목을 저장하는 int를 보유합니다. 나는 이것이 이것이 최선의 방법이 아니라고 생각합니다. 나는 힌트를 위해 열린다! –

답변

2

이것은 범위에 관한 것입니다. entry::listentry::listlistentry 안에 선언 할 때.

list 전역 유형을 원할 경우 struct list;을 클래스 외부의 전역 범위로 이동해야합니다.

선언문을 main 안에 쓰면됩니다.

+0

감사합니다. 전역 변수를 갖는 것은 나쁜 스타일입니다. 그렇죠? –

+0

예, 글로벌 변수는 글로벌 유형보다 훨씬 복잡합니다. –

+0

죄송합니다. 글로벌 유형이란 무엇입니까? 구조체의 정의를 별도의 .h 파일에 넣고 main.cpp 및 entry.h에 해당 구조체를 포함하면 어떻게됩니까? 그게 더 나아질까요? –

관련 문제