2017-01-25 17 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