【问题标题】:Using / to create a simple rational number object使用 / 创建一个简单的有理数对象
【发布时间】:2014-05-09 19:27:00
【问题描述】:

我有一堆非常长的方程形式的数据,其中包括(a/b) 形式的有理数,其中 a 和 b 是整数。我做了一个简单的类,用相应的算术运算符存储有理数。

我正在尝试编写一些能够识别(a/b) 形式的代码,并使用相应的分子和分母构造该类的实例。我更愿意保留输入(a/b) 的原始形式。是否可以重载 / 运算符以使 (a/b) 返回一个有理数对象? (如果没有,有什么解决方法的想法吗?)

非常简化的代码示例:

Param A;
Param B;
(3/5)*A*A + (1/3)*B*B

我的 Param 类与自身以及与有理数类的乘法定义明确。我只需要代码将(3/5)(1/3) 识别为有理数的实例。

【问题讨论】:

  • 我不太确定你到底在问什么。你知道运算符重载吗?如果是这样,您是否面临特定问题?
  • 希望我对 Matthieu M. 的回答的评论能更清楚地说明问题。
  • 那么请edit澄清你的问题。
  • @RobVerheyen 即使在您的编辑中,它也没有解释为什么您试图避免更改输入。由于我们确实向您解释了您确实无法重写 Rational operator/(int, int),并且当您要求解决方法(其中一些是 Matthieu 给您的)时,......我们还能为您做些什么?
  • 好吧,例如,我只是尝试过是否可以重载其他一些运算符,这样我就可以用那个运算符替换每个 / ,但似乎不可能任何一个。我也刚刚阅读了您的其他评论,我完全不知道您可以告诉编辑按照您的描述去做。

标签: c++ class


【解决方案1】:

没有;如果至少有一个操作数是用户定义的类型,则只能重载运算符。您不能重载 operator/,其中两个操作数都是 int 或任何其他内置类型。

你能得到的最接近的是rational(a)/b。这是否比rational(a,b) 更好取决于您的审美判断。

在 C++11 或更高版本中,您可以随意使用用户定义的文字并编写诸如 3_r/4 之类的东西;但我不会。

【讨论】:

  • 更改输入的形状是我试图避免的事情。我编辑了我的问题以更好地反映我的问题。
  • @RobVerheyen:抱歉,(3/5) 无法解释为除整数除法之外的任何内容。
【解决方案2】:

不,你不能写Rational operator/(int, int)。因为你不能为整数重新定义/

【讨论】:

    【解决方案3】:

    直接的答案是否定的:运算符重载需要至少一种用户定义类型(否则,它们会与现有运算符冲突)。

    至于解决方法,有很多可用的:

    • 你可以使用一个函数:rational(a, b)
    • 您可以使用代理对象:MyInt(a) / MyInt(b),这引入了用户定义的类型,因此您可以在该类型上重载运算符 /
    • 您可以使用 C++11 用户定义的文字将整数包装到代理类中,并在其上重载运算符 /1_iRational operator/(MyInt, MyInt)

    您使用哪种解决方案取决于您的具体限制。

    【讨论】:

    • 这些选项的问题是它们需要我更改我的数据,而我真的很难做到这一点。我可以用其他一些字符来改变 a/ 的所有实例,但我不能轻易地将 a/b 的每个实例替换为rational(a,b)。
    • @RobVerheyen:你能把a的类型替换为MyInt吗?如果您提供来自int 的默认构造函数,它应该相对轻松。当然,那么您将必须为MyInt 定义与int 一起使用的所有运算符。
    • 我不确定我理解你的意思。我编辑了我的问题以澄清我的问题。
    • @RobVerheyen 为什么做:argdo %s|(\s*\(\d+\)\s*/\s*\(\d+\)\s*)|rational(\1, \2)|g的vim-equivalent-on-your-editor这么难??
    • @MatthieuM。即使没有 C++11,他也可以使用 static const Rat(1,1); 并将输入中的所有除法替换为 s|/|*Rat/|g...
    猜你喜欢
    • 2019-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-13
    • 1970-01-01
    • 1970-01-01
    • 2021-01-01
    • 1970-01-01
    相关资源
    最近更新 更多