2012-12-11 3 views
1

내가 한 이런 식으로 뭔가 :상호 참조 클래스 객체

struct Vertex { 
    list<Edge*> edges; 
}; 

struct Edge { 
    Vertex* v1; 
    Vertex* v2; 
}; 

컴파일러 오류 :

'에지'

가 어떻게 해결합니까이 범위에서 선언되지 않았습니다 이 두 가지를 별도의 헤더 인 "vertex.h"및 "edge.h"에 넣지 않고이 문제가 발생합니까?

+1

앞으로 선언을 찾습니다. – chris

답변

5

Edge을 사용하기 전에 앞에 전달 선언을 사용하십시오. 그래서, 당신은 앞으로 유형를 선언 할 때 컴파일러가 불완전한 유형 같은 유형을 처리하는 것을

struct Edge; 

struct Vertex 
{ 
    list<Edge*> edges; 
}; 

참고,이 유형의 레이아웃에 대해 아는 것이 아니라 종류가 있는지 그냥 알고 Incomplete 유형을 사용하는 방법에는 몇 가지 제한 사항이 있습니다.

좋은 읽기 : 당신은 유형 전달-선언 할 수 있습니다
When can I use a forward declaration?

1

: 정점을 가지고 있음을 의미하며,

struct Vertex; 
struct Edge { 
    Vertex* v1; 
    Vertex* v2; 
}; 

가장자리의 그 목록은 아마위한 좋은 디자인 아니라는 것을 알고 그래프; 동일한 그래프를 여러 그래프로 재사용하고 싶다면 어떻게해야할까요? (예를 들어, 공항은 여러 사람들이 사용하는 여러 개의 다른 여정에서 합리적인 정점이 될 수 있습니다.)

+0

대신 shared_ptr 정점을 사용할 수 없습니까? 나는 너의 요점을 여기에서 보지 못한다. – Chubsdad

+0

이러한 디자인의 유효한 사용은 삼각 측량입니다. 때로는 정점에 인접한 가장자리를 열거하기를 원합니다. 게다가 클래스에서 가장자리를 제거하면 정점에는 멤버가 전혀 없습니다. 8 -) –

+0

물론 좌표를 저장하는 클래스와 인접한 모서리를 알고있는 좌표를 가질 수 있습니다. –

1

유형이 포인터를 통해 서로 사용하는 경우 다른 유형을 정의하기 전에 그 중 하나를 전달 선언 할 수 있습니다. 예를 들면 다음과 같습니다.

struct Vertex; 
struct Edge { Vertex* v1; Vertex* v2; }; 
struct Vertex { list<Edge*> edges; };