在 C++ 中返回不完整类型的副本

Nam*_*ame 3 c++ visual-c++

我刚刚发现这段代码在 VS 2010 的头文件中(至少)是合法的

class AClass; //forward declaration of AClass (incomplete type);
class UseAClass
{
   public: 
      AClass returnAClass(); //return a copy of incomplete type - AClass ???
}
Run Code Online (Sandbox Code Playgroud)

有人可以解释我为什么要写这个吗?

Naw*_*waz 5

这是允许的,因为在声明返回 的函数时AClass编译器不需要知道 的大小。但是,如果您尝试在那里提供函数的定义(或在 class中创建 type 的成员),则编译器需要它,因此您需要包含定义的头文件。你也可以这样做:AClassAClassUseAClasssizeof(AClass)AClass

void acceptAClass(AClass obj); //only the declaration, NO DEFINITION!
Run Code Online (Sandbox Code Playgroud)

请注意,此技术通常用于打破标头的循环依赖关系,因为这不需要将某些标头包含在.hfile 中:只需前向声明就足够了。在.cpp文件中,您包含标题并提供定义。