这个 C++ 强制转换代码在做啥?
Posted
技术标签:
【中文标题】这个 C++ 强制转换代码在做啥?【英文标题】:What is this C++ casting code doing?这个 C++ 强制转换代码在做什么? 【发布时间】:2014-10-14 12:55:37 【问题描述】:在这里找到:https://github.com/tpaviot/oce/blob/master/src/BRepAdaptor/BRepAdaptor_Curve.cxx
我想知道的是:
((GeomAdaptor_Curve*) (void*) &myCurve)->Load(C,First,Last);
myCurve
已定义为GeomAdaptor_Curve
。所以看起来它将指向myCurve
的指针转换为void*
,然后将that 转换为GeomAdaptor_Curve*
,然后取消引用并调用Load
。这样做有什么可能的原因,而不是简单地调用myCurve.Load
?
【问题讨论】:
遗留代码很可能,之前的时间可能是另一种类型,需要转换为GeomAdaptor_Curve
,但双重转换真的很奇怪,如果涉及指针算术,就不会那么奇怪了。在->
之前,这真的很奇怪。
现在似乎没有任何理由。同一类中的其他方法只需直接调用myCurve.Load()
。
【参考方案1】:
请注意,该语句出现在 const
成员函数中。所以&myCurve
的类型实际上是GeomAdaptor_Curve const*
。这似乎是一种丑陋而令人困惑的说法
const_cast<GeomAdaptor_Curve&>(myCurve).Load(C,First,Last);
为了“避免”编译器警告,您可能会因为尝试使用 C 样式强制转换来规避 const
而变得更加复杂。
【讨论】:
【参考方案2】:我能想到的唯一原因是确保“GeomAdaptor_Curve
的子类”类型的变量被强制调用超类的Load
函数。
转换为void*
,然后转换为GeomAdaptor_Curve*
,将保证该类型被视为后者,无论其实际类型如何。
查看了代码后,我看不出有什么可能性,所以很可能是遗留代码或他们为未来扩展而放入的东西。
可能值得联系 GitHub 上的 dbarbier
用户,因为他们似乎对更改负有全部责任(基于历史记录)。
虽然,由于那段代码似乎在最早的 GitHub 版本中,如果您能找到它们,原作者可能是更好的选择(请参阅文件头中的一个 Remi LEQUETTE)。
【讨论】:
我检查了 repo,正如 OP 所说。myCurve
已经只是 GeomAdaptor_Curve
的类型。不是子类也不是超类。我更愿意认为这个演员只是一个不必要的遗留代码。以上是关于这个 C++ 强制转换代码在做啥?的主要内容,如果未能解决你的问题,请参考以下文章