2013-04-11 1 views
-1

(처음에는 무엇보다도 내 영어는 유감입니다.)이것은 어느 정도까지 나쁜 행동이 될 수 있습니까? [원형 의존성]

순환 의존성의 통사 적 제한을 피하기 위해 다음 제안 된 해결책이 실제로 해결책인지 아니면 더 많은 단점이 있는지 알고 싶습니다 adventages보다 (하자 날이 상호 의존도가 inavoidable 것을 suposse) :

원래 상황 :

class B; 

class A 
{ 
    B needed; 
}; 

class B {}; 

출력 :

B has an incomplete type. 

"솔루션"

template<typename T = class B> 
class tricky_A 
{ 
    static_assert(is_same<T, B>::value, "Too tricky!!"); 

    T needed; 
}; 

class B {}; 

using A = tricky_A<>; 

int main() 
{ 
    A a; // At the instantiation point, B isn't an incomplete type. 
} 

출력 :

No problems. 

일반적인 솔루션은 포인터를 사용하는 것입니다,하지만 당신이 정말로 그들을 필요로하지 않을 때 나는 두 가지 문제를 참조하십시오

1) 다른 로컬 객체에 대한 포인터를 유지하기로 결정한 경우, 객체의 수명이 "보유 된"객체의 수명보다 짧아야합니다 (또는 클래스의 사용자가 확신해야합니다).

2) 동적 메모리를 처리하기로 결정한 경우 메모리를 예약하고 소멸시키는 데 시간을 소비해야하며 코드 예외를 안전하게하기 위해 예외 처리를 처리해야합니다.

*) 더 긴 코드; 작은 가독성; 더 열등한 예지;

이 "솔루션"을 사용하여 다른 솔루션을 검색해야합니까?

수정 : 괜찮습니다. 이것은 진정한 순환 의존이 아니므로 물어볼 것이 없습니다. 이 질문은 닫을 수 있습니다.

EDIT2 : 더 좋은 질문입니다. here.

+3

예제에는 순환 종속성이 표시되지 않습니다. 그것은 그것들에 대해 추론하기가 어렵습니다. –

+0

문제 1)을 해결하기 위해 똑똑한 포인터를 사용할 수 있습니다 –

+0

좋은 트릭 :) <...> –

답변

1

포인터 사용 (그리고 @Andy Prowl RE : 스마트 포인터에 동의 함)이 선호되는 솔루션이라고 생각합니다. 더 긴 코드, 더 작은 가독성, 더 세밀한 유지 보수에 대한 요점과 관련하여, "까다로운"솔루션은 영리하면서 모든 임차인을 침해합니다. 더 길고, 읽기가 어렵고, 관리하기가 더 어렵습니다. 중간 수준의 C++ 개발자는 포인터와 스마트 포인터를 다루는 방법을 알고 있어야하지만 제안한 템플릿 솔루션을 이해할 수는 없습니다.

또한 순환 의존 관계가 예제에 표시되지 않습니다. 그래도 BA에 의존한다고 가정하겠습니다.디자인의이 종류를 처리 할 때 기억해야 할

중요 사항은 다음과 같습니다 헤더와 본문을 분리

  • 도움이됩니다
  • 는 다음과 같은 순서로 #includes을 할 안함 : 몸 #includes, 앞으로 참조 #includes하고, 마지막으로 (필요한 경우) 헤더 #includes
+0

"더 길고, 읽기가 어렵고, 유지하기가 더 어렵습니다."- 원형 종속성이있는 경우에도 작동하지 않습니다. –

+0

맞습니다. 템플릿이 코드를 더 못하게 만듭니다. 그러나 일반적으로 스마트 포인터 또는 포인터는 추가 수준의 리소스를 소비하며 클래스는 필요하지 않습니다. –

+0

@ Peregring-lk : 또 다른 대안은 설계에서 원형 종속성을 제거하려고하는 것입니다 (아마도 제 3 클래스를 추가하여)? 그게 가능한지, 더 자세한 내용 없이는 추측하기가 어렵습니다. 또한 다른 제안 (별도의 헤더/본문 등)을 고려하십시오. A와 B의 정의에 순환 종속성을 격리 할 수 ​​있습니다.이 경우 포인터가 필요하지 않습니다. – Tom

1

디자인 전제가 잘못되었습니다. 코드에 순환 종속성이 없기 때문에 (A 전에 B의 정의를 찾는 것 외에는) 아무 것도 수정할 필요가 없으며 추가 작업을 수행 할 필요가 없습니다.

실제 순환 종속성을 포함하도록 테스트 케이스를 수정하면 솔루션이 문제를 해결하지 못하는 것을 알 수 있습니다. 따라서 기본적으로 더 복잡하고 동일한 문제가되는 코드가 더 있습니다.

또한 올바른 순환 종속성을 처리하는 방법은이를 깨뜨리는 것입니다. 순환 종속성이 사라지면이를 관리해야 할 필요성도 사라집니다. 진짜 원형 종속성을 포함하는 좋은 디자인은 거의 없습니다.