在cpp文件中声明转发的类定义,对于什么?

时间:2011-05-23 12:59:44

标签: c++ forward-declaration

在.cpp文件中转发类定义有什么意义?

想象一下,我在另一个公共类中有一个私有类。我转发了私有类的定义,比如私有类。

将我的私有类的声明放在.cpp文件中是否有任何好处,或者我应该在我的公共class.h中坚持我的前向声明并在cpp文件中包含我的privateClass.h?

4 个答案:

答案 0 :(得分:4)

内部类和结构通常最好不在公共标题之外,以避免依赖和耦合。

如果stuff在公共头中,则意味着如果实现细节(在您的私有类/结构中)发生更改,则公共头必须更改。这很糟糕,因为客户端程序实际上需要重新编译(在ODR - 一个定义规则下)和各种实现定义的类/ vtable布局和/或名称修改的后果。

一旦您可以避免取决于完整私有类型的定义,您将避免拥有所有不需要的依赖项,从而导致

  1. 缩短重建时间
  2. 避免客户端代码对实现私有细节的意外依赖
  3. 前向声明的类在被定义之前被称为“不完整类型”(通常在私有头文件中或简单地在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。

请记住,您可以在多个模块中声明类型,但只能在其中一个模块中定义类型。