我是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;
}
答案 0 :(得分: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)的调用仍然可以正常工作,并将您指定的值添加到您正在创建的Object中。
您的代码存在的问题是范围。我相信你只是重新分配参数/参数而不是实际重新分配你的实例变量,我假设这是你的目标。
答案 1 :(得分:2)
首先,这一行非常错误:
Rational(int numerator = 2, int denominator = 1){ numerator = 2; denominator = 1;};
参数numerator
和denominator
位于您的ctor的堆栈框架中,从而隐藏了您的班级成员Rational::numerator
和Rational::denominator
,其次,您完全忽略了调用者的内容实际上是作为参数发送(不是因为你指定了默认值,而是因为你明确设置了numerator=2; denominator=1
。这一行实际上应该是:
Rational(int numerator = 2, int denominator = 1){ this->numerator = numerator; this->denominator = denominator;};
OR 您可以使用初始化列表(和重载的构造函数):
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;};