2017-03-07 2 views
2

Ich versuche, ein Objekt in Doppelkonverter für ein Big Integer-Programm zu schreiben, indem Sie den Doppelkonversionsoperator überladen. Um dies zu tun, konvertierte ich die große Ganzzahl in eine Zeichenfolge, die ich dann mit der Funktion stod in ein Double konvertierte. Hier ist eine Kopie der Funktion:Objekt zu Doppelkonvertierung Fehler

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; 
} 

Nur zur Klarstellung m_digitCount ist die Anzahl der Stellen in einem bestimmten Objekt.

Wenn ich das Programm ausführen, stürzt es ab und sagt 'abort() wurde aufgerufen.'

eingefügt ich einen Haltepunkt und fand die Programmabstürze bei der Linie

double a = std::stod(*str) 

Wenn dies geschieht es sagt

Unbehandelte Ausnahme bei 0x00007FFB1DEF7788 in Assign4 - Big Integer.exe: Microsoft C++ Ausnahme: std :: invalid_argument am Speicherort 0x00000043F48FD780.

Könnte jemand mir helfen, das Problem zu finden? Vielen Dank.

+0

gut tun, es klingt wie die Zeichenfolge enthält keine gültige Zahl und so hat die Konvertierung eine Ausnahme ausgelöst, die Sie nicht gefangen haben. Was enthält str? – pm100

+3

Sie haben ein Array von 'std :: string's erstellt, eins für jede Ziffer. Alles, was Sie brauchen, ist ein 'std :: string', verwenden Sie' new' nicht, um es zu konstruieren, dann fügen Sie Ihre Ziffern mit etwas wie 'str + = getDigit (j);'. –

+0

@ChristopherOicles Sie haben Recht - ich habe nicht einmal bemerkt. Wie hat sich das kompiliert? Ich denke, dass der echte Code zwangsweise * str zu etwas umwandelt, das kompiliert – pm100

Antwort

2

Das tun nicht, was Sie denken, es tut:

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

, die ein Array von leeren Saiten zuordnet. Ich weiß nicht, wie Ihr Code überhaupt kompiliert.

Wie auch immer, was Sie meinten zu tun war:

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

Beachten Sie, dass die Ziffer ein Zeichentyp sein sollte. Wenn es nur eine Ganzzahl von 0 bis 9 ist, müssen Sie str.push_back('0' + getDigit(j))