前向声明和 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;
}
我对前向声明有疑问。
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;
}