【问题标题】:Defining special division between integers定义整数之间的特殊除法
【发布时间】:2019-09-24 16:35:18
【问题描述】:

我已经在 C++ 中实现了有理数域和运算符 (+,*,-,/) 和 (==,>,

我还为分数和整数之间的运算添加了数学运算符 (+,*,-,/) 和 (==,>,

我在最后一步遇到问题:我想创建一个替代除法运算符 |在整数上,使得 int a | int b = 有理数 (a,b)。 这如何在 C++ 中完成?问题是我不知道如何向“整数类”添加任何方法,我不知道如何编辑这个“隐藏”类。如果我能做到这一点,我只会添加方法

rational operator | (int x){
rational temp;
temp.numerator=value;
temp.denominator=x.value;
temp.reduce();
return temp;
}

到整数类。我在哪里调用了整数类值的类变量。并使用了我在有理类中现有的归约方法。

【问题讨论】:

  • 如果两个操作数都是内置类型,或者两个操作数都是指向任何类型的指针,则不能重载运算符。
  • "我不知道如何在“整数类”中添加任何方法,我不知道如何编辑这个“隐藏”类。"这样的类是不隐藏的。 C++ 中没有这样的类。
  • @NathanOliver 我认为有一种聪明的方法可以重载运算符,其中两个操作数都内置在类型中。我的编译器已经建议没有,但我想也许有办法做到这一点。我有点明白为什么,你当然可以用这个功能破坏东西。谢谢。

标签: c++ class oop


【解决方案1】:

正如评论中所说,您不能重载内置类型。

您可以做的是:将整数包装在一个新类中,在该类中重载此类运算符。

【讨论】:

    【解决方案2】:

    首先,我建议不要这样做,因为operator | 通常不会有这种副作用。以这种方式重载运算符违反了这些重载运算符的一般规则中的rule number 2

    好吧,顺便说一句,C++ 不允许您为整数数据类型重载运算符。如果他们这样做了,那可能会破坏代码。

    但是,您可以使用有理数重载运算符。你可以这样做:

    class rational {
        rational operator|(rational other) {
            return rational(this->numerator, other.numerator);
        }
    };
    
    

    然后,您可以像这样创建一些构造函数:

    class rational {
        // I'm assuming you have something like this for the implementation of operator| to work
        rational(int n, int d) {
            this->numerator = n;
            this->denominator = d;
        }
        // This constructor creates a rational by putting everything over 1
        // This will function the same mathematically as the number itself
        rational(int n) {
            this->numerator = n;
            this->denominator = 1; // a single number is put over 1
        }
    
    };
    

    现在,您可以像这样使用operator|

    rational r = rational(5) | 7;
    

    这似乎接近你想要的。


    注意:当你到达这里时,如果你让有理数在构造函数中接受单个数字并将其置于 1 之上,你可能会意识到你不需要一个特殊的 operator| 来以这种方式创造一个理性。如果你的理性通过使用倒数乘法来实现除法,你可以简单地这样做:

    rational r = rational(5) / 7;
    

    这更清楚你打算做什么。

    【讨论】:

    • 谢谢@Chipster。我已经实现了这一点。我认为会有一种聪明的方法来重载运算符,其中两个操作数都内置在类型中。但正如我的编译器已经建议的那样,这里的许多人都表示没有。
    【解决方案3】:

    我不知道如何编辑这个“隐藏”类。

    整数没有“隐藏”类。 int 和其他整数类型根本不是类;并且不可能重载它们的算术运算符。

    问题是我不知道如何向“整数类”添加任何方法,

    第一步当然是为整数创建一个类。就像你为理性创建了一个类。

    【讨论】:

      【解决方案4】:

      你不能:如果你可以改变a | bint aint b 的行为和类型,那么你能想象会被放开的地狱吗?

      幸运的是,尽管 rational temp{a, b} 符号与您想要的并不相距一百万英里(假设您的 rational 类具有按此顺序排列的分子和分母成员),并且鉴于它是标准 C++,它也是可读的。

      【讨论】:

      • 我看到了潜在的问题,我的编译器已经声明,这是被禁止的。但在我的特殊情况下它会很方便......谢谢你确认,它不会工作。
      【解决方案5】:

      你不能,正如其他剃须刀所说的那样。

      但您可以轻松地接受Rational(int dividend) 生成dividend/1

      然后用户可以很容易地写Rational(dividend)/divisor,你/可以/重载。你必须决定这是否比Rational(dividend,divisor) 更好。当然他们也可以写dividend/Rational(divisor),如果你愿意,你也可以重载它。

      【讨论】:

      • 谢谢,这几乎是我在最初的想法没有实现之后所采取的路线。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-02
      • 2018-10-23
      • 2020-02-12
      • 2018-04-24
      • 2013-09-12
      • 2018-08-16
      相关资源
      最近更新 更多