2011-03-21 5 views
2

두 클래스가 있습니다 : MazeClass와 CreatureClass는 "coordinates"라는 구조체를 사용합니다. 어떻게 두 클래스에서 구조체를 사용할 수 있습니까? 내가 두 번에 구조체를 넣어 시도하고 내가 얻을 :C++ : 클래스간에 구조체

MazeClass.h:16:8: error: redefinition of ‘struct coordinate’

CreatureClass.h:11:18: error: previous definition of ‘struct coordinate’

+1

코드를 게시 할 수 있습니까? –

+0

특히 헤더와 클래스와 좌표가 어떻게 선언되는지 보자. – Mark

+0

두 구조가 모두 같습니까? 대부분의 대답은 그럴 것이라고 가정하지만 두 가지 유형간에 쉽게 이름 충돌이있을 수 있습니다. –

답변

2

public 클래스 중 하나에서 구조체를 선언 할 수 있습니다. 더 관련 클래스를 선택

class MazeClass 
{ 
public: 
    struct coordinate {} ; 
} ; 

다른 클래스가 MazeClass::coordinate으로이 유형에 액세스 할 수 있습니다. 또는 typedef로 가져올 수도 있습니다.

class CreatureClass 
{ 
public: 
    typedef MazeClass::coordinate coordinate ; 
} ; 
0

당신은 그것을 복제하는 대신 하나의 공통 위치에 struct coordinate의 정의를 넣어해야합니다. 새로운 coordinate.h 파일을 만들 수 있습니까? 포함 경비원을 사용하는 것을 잊지 마십시오.

5

헤더 파일에 한 번만 구조체를 정의해야합니다. coordinates을 자체 헤더 파일 (포함 보호 기능 포함)로 이동 한 다음 해당 헤더를 다른 헤더에 모두 포함시킵니다.

coordinates.h : (! - DRY을 머물 유지 보수의 관점에서 끔찍한하지만)

#ifndef COORDINATES_H 
#define COORDINATES_H 

struct coordinates { 
    // ... 
}; 

#endif 

기술적으로는 두 개의 헤더에 coordinates을 정의하기 위해 OK입니다. 문제는 다른 헤더 또는 구현 파일에 두 헤더가 직접 또는 간접적으로 모두 포함되어있을 때 발생합니다. 그런 다음 컴파일러는 두 개의 서로 다른 구조체 정의를보고 (사용자가 동일하다는 것을 모름) 게시했습니다.

0

대수에서 이것을 공통 인자를 "인수 분해"라고합니다.

"coordinate.h"파일을 만듭니다. 그 안에 포함 경비를 사용하여 좌표 구조체의 정의를 배치하십시오.

그런 다음 MazeClass.h 및 CreatureClass.h에서 #include "coordinate.h"을 사용하십시오.