2016-08-13 2 views
0

현재 foo와 bar의 두 클래스가 있습니다. Foo는 메소드 중 하나에서 bar 인스턴스를 사용하고 bar는 생성자에서 foo 인스턴스를 사용합니다. 그러나이 컴파일되지 않습니다. 나는 순환 의존성이 있다는 것을 알고 있으므로 foo의 메소드가 헤더 파일에 선언되기 전에 foo의 내부에 bar를 선언함으로써이 문제를 해결하려고했습니다. 소스 파일에서 foo의 메소드에서 막대 또는 컴포넌트를 실제로 사용할 수 없기 때문에 실패했습니다. 그런 다음 바를 필요로하는 소스 파일의 모든 내용을 이미 정의한 다음 바의 모든 정의를 넣은 다음 바를 사용하는 foo의 메서드를 정의하기 위해 다시 정렬했습니다. 같은 이유로 실패했습니다. 내가 foo는 :: 메서드의 정의에 바의 인스턴스에 대한 참조를 제거 할 때, 코드가 컴파일하고 제대로 실행되는 것을 지적하고 싶습니다C++의 클래스 정의에서 순환 의존성 피하기

// Header.h 
class foo{ 
    class bar; 

    void method(bar& b); 
}; 

class bar{ 
    bar(foo& f, double d); 
}; 

// Source.cpp 
#include Header.h 
// stuff defining foo that I need for bar in the form foo::foo(...){...} 

// stuff defining bar that I need for foo::method 

void foo::method(bar& b){ 
    // do stuff with foo and b 
} 

: 여기에 지금까지 내 코드의 단순화 된 버전입니다.

내 특정 예제에는 foo 클래스가 동질성 좌표의 벡터로, bar 클래스가 쿼터니언으로 있습니다. 쿼터니언 클래스는 생성자에서 벡터와 회전 각도를 사용하며 벡터 클래스는 회전 메서드에서 쿼터니언을 사용합니다.

종속성을 제거하지 않고 코드를 작성하는 방법이 있습니까? 아니면 종속성 중 하나만 제거해야합니까?

+0

'foo' (안에 있지 않음) 앞에'bar'를 선언하면 코드가 잘 작동합니다. – vu1p3n0x

답변

1

앞으로foo 외부 bar를 선언보십시오 :

class bar; 

class foo{ 
    method(bar& b); 
} 

class bar{ 
    bar(foo& f, double d); 
} 

당신이 거기 당신이 foo::bar라는 클래스를 전방 선언했다 없었.

+0

'foo :: method'도 반환 유형을 사용할 수 있습니다. – user4581301

+0

그리고 수업도 끝날 무렵에는 세미콜론이 누락되었습니다. 나는 눈치 채지 못했습니다. 모든 것이 비공개라는 것은 아닙니다 ... 나는 그가 방금 빠른 예시 코드를 작성했다고 생각합니다. – MondKin

+0

@Mondkin 이것은 완벽하게 작동했습니다. 막대가 foo의 하위 클래스 인 경우에도이 작업을 수행 할 수 있습니까? – AlgorithmsX