在.cpp文件中转发类定义有什么意义?
想象一下,我在另一个公共类中有一个私有类。我转发了私有类的定义,比如私有类。
将我的私有类的声明放在.cpp文件中是否有任何好处,或者我应该在我的公共class.h中坚持我的前向声明并在cpp文件中包含我的privateClass.h?
答案 0 :(得分:4)
内部类和结构通常最好不在公共标题之外,以避免依赖和耦合。
如果stuff在公共头中,则意味着如果实现细节(在您的私有类/结构中)发生更改,则公共头必须更改。这很糟糕,因为客户端程序实际上需要重新编译(在ODR - 一个定义规则下)和各种实现定义的类/ vtable布局和/或名称修改的后果。
一旦您可以避免取决于完整私有类型的定义,您将避免拥有所有不需要的依赖项,从而导致
前向声明的类在被定义之前被称为“不完整类型”(通常在私有头文件中或简单地在cpp文件本身中)。在那之前,只允许地址,引用,通过引用传递或通过指针传递。 有时不完整的类会导致棘手的语义情况;对于不完整类型的对象销毁将假定非虚拟析构函数(某些编译器可以检测到这一点,并在实际定义引入虚拟析构函数时发出警告)。这在定义到不完整类型的智能指针时起着重要作用,例如:在流行的pImpl成语中。如有疑问,请使用智能指针库的文档(例如Boost SmartPtr)。
更新添加背景信息链接,因为这是一个受欢迎的答案:
答案 1 :(得分:1)
原因是您的.h
文件应该只包含描述由公共类表示的模块接口的代码。在这种情况下,Private
类的声明和定义是关于模块接口的一个实现,并且不提供如何使用该接口的信息。
答案 2 :(得分:1)
前向声明的要点是能够在没有它的定义的情况下使用该类。您可以只转发声明类Private,并使用指向该类对象的指针或引用,而不包括任何标题或在该文件或包含文件中定义类本身。
如果您将私有类声明放入头文件中,那么基本上它不再是私有的,因为任何人都可以包含该文件。所以要么将它隐藏在另一个类的声明中,要么在cpp文件中声明它,如果可能的话。
答案 3 :(得分:1)
类转发通常用在头文件中。例如:
// Class2.h
class Class1;
class Class2
{
Class1* m_class1; // Using Class1 type
};
这允许Class2.h使用Class1而不必在其头文件中包含Class1.h.当然,包含Class2.h的任何.cpp文件也必须包含Class1.h。
请记住,您可以在多个模块中声明类型,但只能在其中一个模块中定义类型。