2017-03-07 68 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))