gpt4 book ai didi

c++ - 必须 "ask which exact type an object has"是否总是表示设计不好?

转载 作者:搜寻专家 更新时间:2023-10-31 02:06:02 27 4
gpt4 key购买 nike

在 SO 的几个地方,声称必须知道对象的确切类型并基于此做出决定(以 if-then-else 方式)指向一个设计缺陷,例如here .

我想知道是否总是如此。在当前的一个小型教育项目(我正在使用它来学习 C++)中,我想实现算术结构,即项(例如 (3+4)*x-5)和方程(x=3*y+z).现在,从结构的角度来看,方程式与术语非常相似(特别是它们都可以使用 Shaunting-yard algorithm 进行解析),所以我创建了一个基类 math_struct,它既 equationterm 派生自:

class math_struct;
class term : public math_struct {...};
class equation : public math_struct {
void resolve_to(std::string subTerm);
...
};

equation 有一个 term 没有的方法 resolve_to(因为方程可以解析为变量,而 term 不能),但除此之外它们是相等。

现在我有了一个从字符串中解析 math_struct 的方法:

static std::unique_ptr<math_struct> parse_math_struct(std::string formula);

生成的 math_struct 可以是项或方程,具体取决于输入字符串的外观。要知道它是什么,我必须执行 typeid 检查并执行转换以使用(如果可用)resolve_to 成员函数。

这是设计缺陷吗?我该如何改进?

最佳答案

我不知道我是否会称之为“缺陷”,但我会说设计可以改进。检查类型以查看是否可以调用 resolve_to 的一个潜在问题是,如果出于某种原因您发现需要从 math_struct 派生的第三个类,则检查可能会中断>。 (有数学背景的人应该知道,想不出原因不代表没有原因。)

一个更强大的选择是向基类添加一个虚函数,一个返回 true 的简单 bool 值,前提是您可以调用 resolve_to

一个更好的选择可能是考虑如果您正在处理的事情不是方程式,您会怎么做。

To know which it is, I have to do a typeid check and perform a cast to use, if available, the resolve_to member function.

如果 resolve_to 成员函数不可用怎么办?为什么不在基类上有一个虚函数,它被重写为 term 做那件事,并被重写为为 equation 调用 resolve_to? (或者是 resolve_to 用于 equation。)

在某些情况下,最好的选择可能是“询问对象具有哪种确切类型”,但我不相信就是这样。 (我知道有一个 XML 解析器依赖于这种技术;我还没有分析它是否可以改进。)

关于c++ - 必须 "ask which exact type an object has"是否总是表示设计不好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50904311/

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