2017-03-07 94 views
2

我想通过重载双重转换运算符来编写一个对象来双重转换大型整数程序。为此,我将大整数转换为一个字符串,然后使用stod函数将其转换为double。下面是函数的副本:双重转换错误的对象

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) 

程序崩溃发生这种情况时,它说

在0x00007FFB1DEF7788在Assign4未处理的异常 - 大Integer.exe:微软C++异常:STD ::内存位置0x00000043F48FD780处的invalid_argument。

有人能帮我找到问题吗?非常感谢你。

+0

好吧,它听起来像字符串不包含有效的数字,所以转换已经引发了一个异常,你还没有发现。 str包含什么? – pm100

+3

你制作了一个'std :: string's数组,每个数字一个。所有你需要的是一个'std :: string',不要使用'new'来构造它,然后用'str + = getDigit(j);'附加你的数字。 –

+0

@ChristopherOicles你是对的 - 我没有注意到。这是如何编译的?我猜真正的代码强行将* str转换为将编译 – pm100

回答

2

这不会做你认为它的作用:

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))