2014-02-05 5 views
0

그래서이 답변을 검색했으며 관련 정보를 많이 찾았지만 정확하게 대답하지 않았습니다.순환 종속성을 해결하기 위해 구성원 개체를 포인터로 변경하십시오.

가능한 경우 실제 개체를 대신 사용하는 개체에 대한 포인터를 사용할 때 많은 조언을 보았습니다. 가능할 때마다 .h 파일을 .h 파일에 포함시키지 말라는 순환 종속성에 대한 조언을 보았습니다. 클래스의 객체 멤버를 객체의 포인터로 전환하여 많은 코드를 순환 종속성 측면에서 수정했습니다. 나는 많은 조언자들과 겉으로보기에 많은 포인터 멤버들로 끝난다.

제 질문은 원형 종속성을 해결하기 위해 모든 객체 멤버를 포인터로 전환하는 것이 좋지 않습니까? 또는 그것은 나의 수업의 나쁜 구조화를 의미하며 재 설계가 필요합니까? 아니면 좀 더 정확하게 말하면, 포인터에 객체 멤버를 변경하는 것을 순환 의존성으로 정당화 할 수 있습니까? 아니면 각 경우에 너무 구체적으로 내려갈 수 있습니까?

내가 경험있는 프로그래머가 아니기 때문에 이것이 의미가 없으면 사과드립니다.

덕분에

+0

'std :: weak_ptr' 사용을 고려 했습니까? 포인터 순환 의존성을 피하기 위해'std :: weak_ptr'을 사용하는 방법에 대한 많은 정보가 있습니다. –

답변

0

순환 종속성 계층 구조 또는 인터페이스 디자인을 의미, 또는 업무 분리는 최적이다. 주제에 다른

namespace elsewhere { class T; } 
namespace here { 
    class A { 
     std::shared_ptr<T> _t; 
    } 
} 

namespace here { class A; } 
namespace elsewhere { 
    class T { 
     std::shared_ptr<A> _a; 
    } 
} 

: 당신이 그들을 경우 그것은 당신이, 내가 개인적으로 좋아 std::shared_ptr<T*> 할 것 컴파일러는 아직 시작하는 그들과 애플리케이션을 구축해야 할 때 사용하는 트릭 정말 중요하지 않습니다 일반적으로 순환 종속성은 일반적으로 쉽게 트란입니다

[Apriv,Acoupled]<-->[Bcoupled, Bpriv]

같은 무언가가 항상 내가 들어 본 적이없는

[Apriv]<--[Acoupled,Bcoupled]-->[Bpriv]

0

표준화 된 형태로 sformable "이 많은 포인터를 가지고 나쁜 대신 객체를 사용하려고"... 당신이 방법을 모르는 경우 포인터가 "위험"입니다 을 사용하지만 같은 클래스의 생각하는 다음과 같은 : myClass가 할당됩니다 경우/많이 해제

class myClass { 
private: 
    GIGANTIC_OBJECT obj; 
} 

은 ... 당신은 오히려 큰 객체 또는 그들 중 하나에 대한 포인터를 가질까요?

헤더 파일의 순환 종속성은 또 다른 문제점입니다 (불투명 포인터를 사용하지 않는 한 객체를 가리키는 경우 헤더를 포함시켜야 함). 그러나 만난다면 그 의미는 다음과 같습니다. 디자인상의 결함

foo.h

class foo { 
public: 
    bar b; 
}; 

bar.h 위

class bar { 
public: 
    foo f; 
}; 

불법 당신은 쉽게

foo는 그것을 피할 수 있습니다.시간

class bar; // forward declaration 
class foo { 
    ... 
    bar *b; 
    ... 
}; 

bar.h

class foo; // forward declaration 
class bar { 
    ... 
    foo *f; 
    ... 
}; 

(https://stackoverflow.com/a/4816751/1938163) 또한

: 한 번 지시어는 다중 선언을 줄이는 데 도움이의 #pragma 의 사용.

요약 : 더 많은 포인터 또는 개체가 하나 이상있는 규칙이라고 생각하지 않습니다. 예를 들어 함수에 값을 통해 큰 개체를 전달하는 것이 어리석은 경우입니다. 헤더의 순환 종속성은 다음과 같습니다. 일반적으로 당신이 "올바르게 설계 했습니까?/틀린 일을하고 있습니까?"라고 생각하게 만드는 상대적으로 연결이 끊어진 문제.