我有关于前瞻性声明的问题。
namespace downloader {
class IHttpThreadCallback ;
class MemoryHttpRequest ;
}
当我施展
auto responseHttpRequest = dynamic_cast<downloader::MemoryHttpRequest*>(m_callback);
显示警告不完整类型。我该怎么办,请向我建议。
除了我试图包括课程,但它不起作用,我认为这不是一个好主意。非常感谢你答案 0 :(得分:3)
显示警告不完整类型。我该怎么办,请向我建议。
要使用dynamic_cast
,必须填写类型。解决方案:包括定义。
除此之外,我尝试包括课程,但它不起作用,我认为这不是一个好主意。
包含类定义不仅是一个好主意,而且如果您需要使用dynamic_cast
则必须包含。在这种情况下,使用前向声明不是解决问题的方法。
在我的情况下,我需要的类在.cpp文件中定义
在这种情况下,您不能向下转换为该类型 - 除非您将类定义移动到您包含的标题中。
答案 1 :(得分: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;
}