前向声明和强制转换不完整类型 C++

forward declaration and Cast incomplete type C++

本文关键字:类型 C++ 转换 声明      更新时间:2023-10-16

我有关于前向声明的问题。

namespace downloader {
class IHttpThreadCallback ;
class MemoryHttpRequest ;

}

当我选角时

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

它显示警告不完整类型。我应该怎么尝试,请向我建议。

除此之外,我尝试包括类,但它不起作用,我认为这不是一个好主意。谢谢

它显示警告不完整类型。我应该如何尝试,请向我建议。

要使用 dynamic_cast ,类型必须是完整的。解决方案:包括定义。

除此之外,我尝试包括类,但它不起作用,我认为这不是一个好主意。

包含类定义不仅是一个好主意,而且如果您需要使用 dynamic_cast ,则必须这样做。在这种情况下,使用前向声明不能解决问题。

在我的情况下,我需要的类是.cpp文件中定义的

在这种情况下,不能向下转换为该类型 - 除非将类定义移动到包含的标头中。

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;
}