如何解决在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。
请记住,您可以在多个模块中声明类型,但是只能在其中一个模块中定义类型。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。