【发布时间】:2017-03-07 23:29:43
【问题描述】:
我正在尝试通过重载双转换运算符来为 Big Integer 程序编写一个对象到双转换器。为此,我将大整数转换为字符串,然后使用 stod 函数将其转换为双精度。这是函数的副本:
BigInteger::operator double () {
std::string *str = new std::string[this->m_digitCount];
for (int j = 0; j < this->m_digitCount; j++) {
str[j] = this->getDigit(j);
}
double a = std::stod(*str);
return a;
}
只是为了澄清 m_digitCount 是给定对象中的位数。
当我运行程序时,它崩溃并显示“已调用 abort()。”
我插入了一个断点,发现程序在该行崩溃
double a = std::stod(*str)
当这种情况发生时,它会说
Assign4 中 0x00007FFB1DEF7788 处的未处理异常 - Big Integer.exe:Microsoft C++ 异常:内存位置 0x00000043F48FD780 处的 std::invalid_argument。
有人可以帮我找出问题吗?非常感谢。
【问题讨论】:
-
好吧,听起来字符串不包含有效数字,因此转换引发了您尚未捕获的异常。 str 包含什么?
-
您创建了一个
std::strings 数组,每个数字一个。您只需要一个std::string,不要使用new来构造它,然后在您的数字后面加上str += getDigit(j);之类的东西。 -
@ChristopherOicles 你是对的——我什至没有注意到。这甚至是如何编译的?我猜真正的代码强制将 *str 强制转换为可以编译的东西
-
@pm100 这是有效代码,实际上我不确定它为什么会崩溃——
std::strings 数组中的每个元素都设置为 bignum 的一个数字(每个字符长度)。然后std::stod(*str)只引用数组中的第一个元素。所以这肯定是完全错误的,但*str应该是一个有效对象,除非m_digitCount可能为零? -
@ChristopherOicles 你是对的,它会读取第一个字符串(我想的是字符串向量,也不是真正的老式数组)
标签: c++