gpt4 book ai didi

c++ - 在此特定上下文中,从基础到派生的 static_cast 是否被视为 "safe"?

转载 作者:太空宇宙 更新时间:2023-11-04 11:32:24 26 4
gpt4 key购买 nike

在多态层次对象树中,只有Root类型实例有 null _parent .我正在使用此方法获取特定树节点的根对象:

inline Root * root() {
Object * r = this;
while (r->_parent) r = r->_parent;
return static_cast<Root *>(r);
}

我一直在读到从基础到派生的静态转换通常被认为是不安全的,但是我的特殊情况呢,其中 Root类型可以通过 null 来识别_parent

最佳答案

只要您的不变量成立,它就是安全的。然而,对大型代码库的广泛部分强制实现的不变量很少保持不变。

至少,我会插入一个 Assert(dynamic_cast<...>(...))在这里,在每一个地方parent被修改,试图在调试中强制执行不变量。

另一种方法是公开 virtual Root* as_root()只返回非 nullptrRoot .这比(大多数)贵static_cast s,但将转换逻辑放在中央可搜索位置。这样的 virtual 很少见调用是您程序的瓶颈。

更有趣的是'如果找不到 Root 怎么办? ?返回 nullptr可能,这意味着在所有调用站点处理它,至少在 Assert 级别正在调试。如果假定调用站点不处理它,则返回 Root&相反,并在调试中失败调用终止/退出(在 Assert 之后)(或者如果你在那里检查它,在记录/通知/等之后释放)。

关于c++ - 在此特定上下文中,从基础到派生的 static_cast 是否被视为 "safe"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24229602/

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