2014-04-12 4 views
2

내가 다음과 유사한 Target 클래스가 : 이제불완전한 유형 : 기능

class Target 
{ 
    std::function<void(A&,B&,C&)> Function; 
} 

을,이 매개 변수 유형 중 하나를 (예를 들어 A)하는 Target 멤버가 그 함수를 호출하려고합니다 :

class A 
{ 
    Target target; 
    void Foo(B& b, C& c) 
    { 
    target.Function(*this,b,c); 
    } 
} 

아래 두 줄은 헤더 파일에 표시됩니다. 순환 종속성이 주어지면 전달 선언이 있고 불행하게도 error : pointer to incomplete class type is not allowed 오류가 발생합니다.

질문은 -이 문제에 대해 어떻게 할 수 있습니까?

+2

'Foo'를 라인 밖으로 정의 하시겠습니까? 순환도가 어떻게 발생하는지 정확하게 보여줄 필요가 있다고 생각합니다. 정확히 어떤 오류가 발생했는지, 어디에서 확인할 수 있습니까? –

+0

"이것에 대해 어떻게해야합니까?" - 뭐가? – SChepurin

+0

@SChepurin 어떻게 오류가 발생하지 않도록 할 수 있습니까? –

답변

1

당신은 circular dependency 문제가 있습니다. class A에 포인터로 target을 선언하고 적절하게 생성자에 할당하고, 클래스의 소멸자에서 할당을 해제 :

class A 
{ 
    A() : target(new Target) {} 
    ~A() { delete target; } 
    Target *target; 
    void Foo(B &b, C &c) 
    { 
    target->Function(*this, b, c); 
    } 
}; 

컴파일러는 C++ (11) 사용을 지원하는 경우 스마트 포인터 대신 :

class A 
{ 
    A() : target(std::unique_ptr<Target>(new Target)) {} 
    std::unique_ptr<Target> target; 
    void Foo(B &b, C &c) 
    { 
    (*target).Function(*this, b, c); 
    } 
};