gpt4 book ai didi

c++ - 在 C++ 中为同一个类拥有 2 个头文件是否合法?

转载 作者:行者123 更新时间:2023-12-05 04:29:44 24 4
gpt4 key购买 nike

在我看的一个项目中,同一个类有两个头文件和两个声明。一个由使用该库的程序使用,用作接口(interface)。另一种是库本身使用的接口(interface)头文件,比较简单。它不包含私有(private)成员并且方法较少。即使出现在两个文件中的方法也可能不会以相同的顺序出现。我想知道为同一个类拥有 2 个头文件是否合法?如果不是,可能的后果是什么?

最佳答案

简而言之

这根本不合法。根据提交的私有(private)部分中的内容,它可能适用于某些实现,但它很可能在编译器的第一次更改或新版本中失败。只是不要。有更好的方法可以实现预期目标。

更多解释

为什么不合法?

这是One Definition Rule (ODR) .它在标准中定义,在一个很长的部分 [basic.def.odr] 中。总之,在不同的编译单元(例如您的代码和库的代码)中可以对同一类进行多个定义,但前提是它是完全相同的定义。这要求它是用于两个定义的完全相同的标记序列,如果您省略私有(private)成员,情况显然不是这样。 (注意还有额外的要求,但是第一个已经坏了,所以我短路了)。

为什么它在某些情况下即使不合法也能在实践中发挥作用?

这纯粹是依赖于实现的运气。为了不鼓励危险行为,我不会展开这个话题。

有什么选择

只需在所有地方使用相同的类定义即可。私有(private)成员是私有(private)的,那么将它们留在原处会有什么风险?

好吧,有时私有(private)成员的定义也需要公开私有(private)类型,以链式 react 结束,太多了。遇到这种情况,你可能会想到:

  • 简单 opaque pointer技术,它使用指向私有(private)实现类的指针,其类型已声明但未在不需要知道的编译单元中定义。
  • 越详细bridge pattern ,它允许为抽象构建类层次结构,并为实现构建类层次结构。它的使用方式与不透明指针类似,但允许不同类型的私有(private)实现类(这是一个复杂的模式,如果只是为了隐藏私有(private)细节,那就太过分了)。

关于c++ - 在 C++ 中为同一个类拥有 2 个头文件是否合法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72245006/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com