Перегрузка операторов в C ++ - компилируется, но вылетает - PullRequest
1 голос
/ 14 марта 2012

Я создал класс MegaInt, который мог бы обрабатывать очень большие числа, и перегружал несколько операторов.К сожалению, я застрял, и мой код просто падает.

Каждый объект MegaInt имеет значение вектора и знак bool.Каждая позиция числа помещается в вектор (т. Е. 4325 является векторным значением = {5,2,3,4}), и его знак (+ или -) равен 1 или 0.

вот немногокода ...

        #include <vector>
        #include <string>
        using namespace std;

        class MegaInt{
            friend class main;
            private:
                vector<int> value;
                bool sign; //true is pos, false is neg

            public:
                MegaInt(vector <int> x, bool y);
                MegaInt(string s);
                MegaInt(const MegaInt& m);
                MegaInt & operator*=(const MegaInt &rhs);

                #include <iostream>
                using namespace std;
                #include "MegaInt.h"
                #include <math.h>

                MegaInt::MegaInt(string s){
                    int pos = s.length()-1;

                    while (pos >= 0){
                        if(pos == 0 && s[pos] == '-'){
                            sign = false;
                            break;
                        }
                        else if (pos == 0 && s[pos] == '+'){
                            sign = true;
                            break;
                        }
                        else{
                            sign = true;
                        }
                        if(s[pos] >= 48 && s[pos] <= 57)
                            value.push_back(s[pos]-48);
                        else{
                            value.clear();
                            break;
                        }
                        pos --;
                    }
                    chopoffleadingOs();
                }
                MegaInt::MegaInt(const MegaInt& m){
                    value = m.value;
                    sign = m.sign;
                }

                MegaInt operator*(const MegaInt& x, const MegaInt& y){
                    int multi = 0;
                    int temp;
                    vector<int> total;

                    for(int i = x.value.size()-1; i>=0; --i){
                        for(int j = y.value.size()-1, k = 0; j>=0; --j, ++k){
                            temp = x.value[i] * y.value[j];
                            if (total.size() <= (i + multi + 1))
                                                     total.resize(i + multi + 1 + 1);
                                                total[i + multi] += (temp % 10);
                                                temp = (temp - total[i]) / 10; 
                                                total[i + multi + 1] += temp;
                                                     }
                                                     multi++;
                                                    }

                                        reverse(total.begin(), total.end());

                return newTotal;
                }

В основном я застрял в перегруженной части умножения.Остальное, я думаю, я получил.

Спасибо, Ноа

Ответы [ 2 ]

1 голос
/ 14 марта 2012

Вероятно, проблема здесь:

total[i+multi]+=(8%10);

Вы используете вектор total, но для него не выделена память.Это можно сделать с помощью функции resize:

total.resize(MAX_SIZE);

Хороший способ обнаружить непредвиденные сбои - использовать отладчик.Если вы запустите программу в отладчике, она остановится, когда возникнет проблема, поэтому вы сможете изучить переменные и посмотреть, где происходит сбой и что могло его вызвать.

Редактировать:

Если вы заранее не знаете размер вектора total, вам необходимо динамически изменить его размер:

if (total.size() <= (i + multi + 1))
    total.resize(i + multi + 1 + 1);  // An extra +1 because vectors are zero-indexed

total[i+multi]+=(8%10);
// ...
0 голосов
/ 14 марта 2012

Всегда лучше предоставить полностью компилируемый образец, если это возможно; позволяет людям на самом деле попробовать образец, если у них есть время. Не публикуйте все - только минимум, необходимый для демонстрации проблемы.

Используйте отладчик - проследите свой код через вложенные циклы for и проверьте, какие значения вы получаете для индексов в векторах.

(Поскольку вы используете Eclipse, дважды щелкните левое поле, чтобы установить точку останова на линии. Используйте для запуска до точки останова. Выделите переменную или выражение, чтобы просмотреть и щелкните правой кнопкой мыши выделенную область, затем выберите « Смотреть 'из меню, чтобы добавить его в окно просмотра.

Затмение может быть немного бесполезным в том, что касается исходного кода. Если вы изучаете C ++, я бы порекомендовал что-то более дружественное - лично я бы порекомендовал Visual C ++ Express (это бесплатно). )

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...