前向声明和 Cast 不完整类型 C++

forward declaration and Cast incomplete type C++

我对前向声明有疑问。

namespace downloader {
class IHttpThreadCallback ;
class MemoryHttpRequest ;

}

当我施法时

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

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

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

It show warning incomplete type . How should I try , please suggest to me.

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

beside that I try to include class , but it not work and I think it not good idea .

包括 class 定义不仅是个好主意,而且如果您需要使用 dynamic_cast 也是强制性的。在这种情况下,使用前向声明并不能解决您的问题。

in my situation , the class which I need is defined in .cpp file

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

dynamic_cast 使用 vtable 查询和导航 class 层次结构。它还需要知道 class content/layout 才能计算偏移量。这就是编译器需要知道 class 定义的原因。 static_cast 需要在 class 之间有关系。

如果您确定 return 值并且乐于避免 runtime/type 检查,那么您可以考虑使用 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;
}