【问题标题】:Object to double conversion error对象双重转换错误
【发布时间】: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++


【解决方案1】:

这并不像你认为的那样:

std::string *str = new std::string[this->m_digitCount];

这会分配一个空字符串数组。我什至不知道你的代码是如何编译的。

不管怎样,你的本意是这样的:

std::string str;
str.reserve( m_digitCount );
for (int j = 0; j < m_digitCount; j++) {
    str.push_back( getDigit(j) );
}
return std::stod(str);

注意数字应该是字符类型。如果只是 0 到 9 之间的整数,则必须这样做str.push_back( '0' + getDigit(j) )

【讨论】:

    猜你喜欢
    • 2018-12-10
    • 1970-01-01
    • 2013-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-05
    • 1970-01-01
    相关资源
    最近更新 更多