2012-05-07 1 views
0

한다고 가정 구조체 A와 B는 정의 싱글 구조체입니다순환 생성자

struct A 
{ 
    B& b_; 
    static A& shared_a() { ... } 
    A() : b_(B::shared_b()) { ... } 
}; 

struct B 
{ 
    A& a_; 
    static B& shared_b() { ... } 
    B() : a_(A::shared_a()) { ... } 
}; 

코드를 컴파일 할 수 있도록 파일 구조가 구성되어 있다고 가정하자.

A :: shared_a가 처음 호출되면 A의 공유 인스턴스가 생성됩니다. A의 공유 인스턴스 생성자는 B :: shared_b를 호출하여 B의 공유 인스턴스를 생성합니다. B의 공유 인스턴스에 대한 생성자는 A :: shared_a를 호출합니다. 그러나 A의 공유 인스턴스는 생성자를 완성하지 못했습니다! 따라서 이러한 생성자는 무한 루프됩니다.

이러한 루프를 방지하기 위해 클래스 A와 클래스 B를 병합 할 수 있지만 그렇게하지 않으려합니다. 보다 우아한 솔루션이 있습니까?

감사합니다,

샘이 shared_a의 A_constructor에 shared_a B 자체의()에 대한 참조를 수 있도록 제공에 대해 그것의 B_을 할 수있는 해당 참조를 설정하는 방법

+0

무한 루프 문제를 확인 했습니까? – jdizzle

답변

1

코드가 정의되지 않은 동작을 나타내며 언급 한 무한 루프 나 다른 이상한 동작이 발생할 수 있습니다. 이제는 문제를 해결하는 방법과 문제가 아니라 대개 코드 냄새 인 주기적 종속성을 깨뜨리는 것입니다.

디자인이 의미가 있다고 확신하는 경우 생성자가 참조 만 저장하면 (객체를 사용하지 않고) 생성자를 변경하여 객체에 대한 참조를 가져올 수 있습니다.

다시 말하지만 순환 종속성은 피할 수 있습니다.