【发布时间】:2019-09-04 15:28:56
【问题描述】:
我必须使用基于树的对象层次结构,我需要在其中访问包含应用程序所需数据的最深元素。我不确定前面的陈述是否最好地解释了问题本身,所以最好用一个例子来说明它。鉴于以下情况:
class A {
private:
B* _b;
public:
B* getB() {return _b;}
};
class B {
private:
C* _c;
public:
C* getC() {return _c;}
};
class C {
private:
int _n;
public:
int getN() {return _n;}
};
所需的操作是通过 A 访问 n。所以我会调用以下内容:
A foo;
foo.getB()->getC()->getN();
当路径的任何部分为空时,问题就出现了,我们最终会产生核心转储。在上述场景中,如果 B 为空,我们将进入核心转储场景。
因此,我就可以用来避免这种核心转储情况的任何策略或模式寻求帮助和建议。如果路径非常大,我最终会检查每个指针是否有效,并最终得到非常丑陋的代码,并且还有可能错过检查路径的一部分的风险。 注意:我无权更改类(A、B、C)的层次结构的实现,因为它们是生成的代码,我无权更改生成器。是我的首选解决方案,但不幸的是我不能。
【问题讨论】:
-
为什么指针一开始就无效?这些对象的生命周期是多少?谁管理这些指针?它们是任何不变量的一部分吗?
-
是的,很遗憾,因为您以这种方式设计架构,代码会很丑陋。 C++ 没有像 C# 那样的“安全导航运算符”。您必须自己实施。但更好的选择是显着重构您的架构。你应该尽量避免有好几层的耦合,因为处理它们总是一场噩梦。
-
不是答案,而是:得墨忒耳定律表明,当您发现自己不得不像这样链接多个取消引用时,是时候重构您的 API 以便您不再需要这样做了:@987654321 @
-
@JeremyFriesner 在“清洁代码”中称为“train wreck”。