我刚刚发现此代码在VS 2010中的头文件(至少)中是合法的
class AClass; //forward declaration of AClass (incomplete type);
class UseAClass
{
public:
AClass returnAClass(); //return a copy of incomplete type - AClass ???
}
有人可以解释一下我为什么要写这个?
答案 0 :(得分:4)
允许这样做,因为编译器在返回AClass
的函数的声明点不需要AClass
大小的知识。但是,如果您尝试在其中提供函数的定义(或在类AClass
中创建UseAClass
类型的成员),则需要sizeof(AClass)
由编译器,因此您需要包括定义AClass
的头文件。你也可以这样做:
void acceptAClass(AClass obj); //only the declaration, NO DEFINITION!
请注意,此技术通常用于打破标头的循环依赖性,因为这不需要在.h
文件中包含一些标头:只需前向声明就足够了。在.cpp
文件中,您包含标题并提供定义。