在cpp文件中声明转发的类定义,该做什么用?

| 在.cpp文件中转发类定义有什么意义? 想象一下,我在另一个公共班级中有一个私人班级。我转发了私有类的定义,例如Private类。 将私有类的声明放入.cpp文件有什么好处?还是我应该坚持在我的public class.h中使用前向声明,并将我的privateClass.h包括在cpp文件中?     
已邀请:
内部类和结构通常最好不要放在公共头文件中,以避免依赖和耦合。 如果东西在公共头文件中,这意味着如果更改了实现细节(在您的私有类/结构中),则公共头文件将必须更改。这很糟糕,因为实际上将需要重新编译客户端程序(根据ODR-一个定义规则),并且各种实现定义的结果将对类/ vtable布局和/或名称修饰产生影响。 一旦可以避免依赖于完整私有类型的定义,就可以避免具有所有不需要的依赖项,从而导致 减少重建时间 避免客户端代码对实现私有细节的意外依赖 在未定义前声明类(通常在私有头文件中或在cpp文件本身中)之前,其称为“不完整类型”。在此之前,仅允许地址,引用,逐个引用或指针通过。 有时,不完整的类会导致棘手的语义情况;不完整类型的对象销毁将假定使用非虚拟析构函数(某些编译器可以检测到这种情况,并在实际定义中引入虚拟析构函数时发出警告)。在将智能指针定义为不完整的类型(例如,在流行的pImpl习语中。如有疑问,请仔细阅读智能指针库(例如Boost SmartPtr)的文档。 更新添加背景链接,因为这是一个受欢迎的答案: Boost shared_ptr <>构造函数需要完整的类型 39.11如何创建两个彼此了解的类? 39.12将前向声明与成员对象一起使用时,需要哪些特殊注意事项? 39.13在内联函数中使用前向声明时,需要哪些特殊注意事项? 39.14为什么不能将前向声明的类放在std :: vector <>中?     
原因是您的“ 0”文件应仅包含描述模块接口的代码,这些代码由公共类表示。在这种情况下,有关模块接口的声明和定义是
Private
类的实现,并且不带任何有关如何使用该接口的信息。     
前向声明的重点是无需定义即可使用该类的能力。您可以只将声明类声明为Private,并使用指向该类对象的指针或引用,而无需在该文件或包含的文件中包含任何标题或定义类本身。 如果将私有类声明放入头文件中,那么基本上它不再是私有的,因为任何人都可以包含该文件。因此,要么将其隐藏在另一个类的声明中,要么将其隐藏在cpp文件中(如果可能的话)。     
在头文件中通常使用类转发。例如:
// Class2.h

class Class1;

class Class2
{
    Class1* m_class1; // Using Class1 type
};
这允许Class2.h使用Class1,而不必在其头文件中包含Class1.h。当然,任何包含Class2.h的.cpp文件也必须包含Class1.h。 请记住,您可以在多个模块中声明类型,但是只能在其中一个模块中定义类型。     

要回复问题请先登录注册