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

时间:2017-01-25 11:14:08

标签: c++ dynamic-cast

我有关于前瞻性声明的问题。

namespace downloader {
class IHttpThreadCallback ;
class MemoryHttpRequest ;

}

当我施展

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

显示警告不完整类型。我该怎么办,请向我建议。

除了我试图包括课程,但它不起作用,我认为这不是一个好主意。非常感谢你

2 个答案:

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