1

我是 C++ 的初学者。我想知道为什么在这一行抛出异常:

operator double() const
{
    return this->denominator/this->numerator;
}

我找到了numerator == 0,但我在ctor. 为什么?请帮我。

class Rational {
public:
    int numerator;
    int denominator;

    Rational(int numerator = 2, int denominator = 1)
    {
        numerator = 2;
        denominator = 1;
    };

    operator double() const
    {
        return this->denominator/this->numerator;
    };

};

int main(int argc, const char * argv[])
{
    Rational r(1, 2);
    cout << r;
    //   double d = 0.5*r;
    return 0;
}
4

2 回答 2

2

首先,这一行是非常错误的:

Rational(int numerator = 2, int denominator = 1){ numerator = 2; denominator = 1;};

参数numeratordenominator在你的ctor的堆栈框架中,因此隐藏了你的类的成员Rational::numeratorRational::denominator其次,你完全忽略了调用者实际发送的参数(不是因为你指定了默认值,而是因为你明确地设置了numerator=2; denominator=1。这一行应该实际上是:

Rational(int numerator = 2, int denominator = 1){ this->numerator = numerator; this->denominator = denominator;};

或者您可以使用初始化列表(和重载的构造函数):

Rational() : numerator(2), denominator(1) {};
Rational(int numerator, int denominator) : numerator(numerator), denominator(denominator) {};

现在,第二个问题是int/int => int:: 将一个整数除以另一个整数会产生整数除法,您需要将其中一个 int 转换为 double 以便在计算除法之前将两个 int 上转换为 double,如下所示:

operator double() const{ return ((double)this->denominator)/this->numerator;};
于 2013-07-22T14:14:55.757 回答
2
    Rational(int numerator = 2, int denominator = 1)
{
    numerator = 2;
    denominator = 1;
};

我会将其更改为

    Rational(int numerator, int denominator)
{
    this->numerator = numerator;
    this->denominator = denominator;
};

我不确切知道这是否会导致您的问题,但我认为这是造成问题的原因。您对 Rational(int,int) 的调用仍然可以正常工作,并将您指定的值添加到您正在创建的对象中。

您的代码的问题是范围。我相信您只是重新分配参数/参数,而不是实际重新分配您的实例变量,我假设这是您的目标。

于 2013-07-22T14:14:26.280 回答