2017-01-25 10 views
-1

전달 선언에 관한 문제가 있습니다.전달 선언 및 캐스트 불완전 유형 C++

namespace downloader { 
class IHttpThreadCallback ; 
class MemoryHttpRequest ; 

은} 나는

auto responseHttpRequest = dynamic_cast<downloader::MemoryHttpRequest*>(m_callback); 

그것은 불완전한 유형의 경고 표시를 캐스팅 할 때. 어떻게해야합니까, 저에게 제안하십시오.

나는 클래스를 포함 시키려고하지만, 작동하지 않으며 좋은 생각이라고 생각하지 않습니다. 대단히 감사합니다.

+1

예를 넣습니다. –

+0

클래스 및 구조체의 전달 선언은 클래스 또는 구조체가 존재 함을 컴파일러에만 알리고, 전체 정의가 필요한 클래스 또는 구조체를 사용하도록 지시합니다. –

+1

왜 수업을 포함하는 것이 나쁜 생각이라고 생각합니까? (그리고 작동하지 않는 것은 무엇입니까?) – doctorlove

답변

2

경고 불완전 유형을 보여줍니다. 어떻게해야합니까, 저에게 제안하십시오.

dynamic_cast을 사용하려면 유형이 완료되어야합니다. 해결책 : 정의를 포함하십시오.

나는 클래스를 포함 시키려고하지만, 작동하지 않으며 좋은 아이디어라고 생각합니다.

클래스 정의를 포함하는 것은 좋은 생각 일뿐만 아니라 dynamic_cast을 사용해야하는 경우 필수입니다. 이 경우 전달 선언을 사용하는 것이 문제의 해결책이 아닙니다. 내 상황에

, 나는이 경우

.cpp 파일에 정의되어 필요한 클래스, 그 유형으로 다운 캐스트 할 수 - 당신은 당신이 포함 헤더로 클래스 정의를 이동하지 않는 한 .

+0

대답은 매우 명확합니다. 제 상황에서는 현재 소스 코드를 유지해야합니다. 그들은이 경우를 위해 앞으로 선언문을 사용한다.덕분에 –

1

dynamic_cast는 vtable을 사용하여 클래스 계층을 조사하고 탐색합니다. 또한 오프셋을 계산하기 위해 클래스 내용/레이아웃을 알아야합니다. 그래서 컴파일러는 클래스 정의를 알아야합니다. static_cast는 클래스 사이에 관계가 있어야합니다.

반환 값이 확실하고 런타임/형식 검사를 피할 수 있으면 reinterpret_cast를 사용하는 것이 좋습니다.

그렇지 않으면 정의를 포함해야합니다.

나는 당신은 클래스 정의를 포함 할 필요가 함께

#include <iostream> 
#include <vector> 
#include <iostream> 

namespace n { 
    class A; 
    class B; 

    n::A* f(); 
} 

std::ostream& operator<<(std::ostream& os, n::A& a); 
std::ostream& operator<<(std::ostream& os, n::B& b); 

int main() 
{ 
    n::A* a(n::f()); 
    n::B* b=reinterpret_cast<n::B*>(n::f()); 

    std::cerr << "a: " << *a << std::endl; 
    std::cerr << "b: " << *b << std::endl; 
} 

namespace n { 
    class A 
    {}; 

    class B: public A 
    {}; 

    n::A* f() { 
    return new A(); 
    } 
} 

std::ostream& operator<<(std::ostream& os, n::A& a) { 
    os << "in A"; 
    return os; 
} 

std::ostream& operator<<(std::ostream& os, n::B& b) { 
    os << "in B"; 
    return os; 
} 
+1

정적 다운 캐스팅도 정의가 필요합니다. – user2079303

+0

@ user2079303 실제로. 업데이 트됩니다 – ccpgh