当我试图为自己写一个处理代数表达式的库时,我遇到了一个问题。我有三个类:divide,expression,groupexpression,我想在expression和group表达式中使用divide类型,在group表达式中使用expression类型,问题是我还需要在divide类中使用group表达式类型,如下所示:
// * (2x)/(4b)
class Divide{
//...
GroupExpression numerator, denumerator;
//...
}
// * -2Pow(x, 3)
class Expression{
//...
Divide pow, multiple;
//...
}
// * (2x-3ax+Pow(x, 5))/(ax-2x)
class GroupExpression : Divide{
//...
vector<Expression> group;
//...
}
但这不符合编程规则,我们应该先声明它才能使用它。如何排序才符合规则?
我一直在想这个异常,但没有找到任何答案。没有找到任何解决方案,在互联网上,因为我不知道如何搜索这个问题,所以我感谢任何帮助。
有可能这样做吗?
1条答案
按热度按时间0qx6xfy61#
如果不知道你想做什么,我就不知道正确的设计。
但是一个典型的方法是有一个
BaseExpression
类,然后你可以有像DivideExpression
这样的子类,它们有成员变量denominator
和numerator
,这些变量本身就是BaseExpression
类,这些表达式可能是另一个类的具体示例,比如ExpressionTerm
,但是DivideExpression
不需要知道这些细节。它所需要知道的只是它们的类型是BaseExpression
,这是最先声明的。现在你想让所有人都能使用的方法,比如打印和求值,都应该是
BaseExpression
上的方法,更进一步,你可以用一个解析器把文本表达式转换成解析树,然后再把解析树转换成合适的Expression
对象。注意,你不可能不需要一个通用的
GroupExpression
,因为这个需求可以通过创建一个特定类型表达式的递归树来满足,除了从BaseExpression
继承的表达式之外,没有一个表达式需要知道更多关于它们的子表达式的信息。