簡體   English   中英

C ++中的重載運算符-編譯但崩潰

[英]Overloading operators in C++ - compiles but crashes

我制作了一個MegaInt類,該類可以處理非常大的數目,並使一些運算符過載。 不幸的是,我被卡住了,我的代碼崩潰了。

每個MegaInt對象具有一個矢量值和一個布爾符號。 數字的每個位置都放在向量中(即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;
                }

我主要似乎停留在重載乘法部分。 剩下的我想我知道了。

謝謝,諾亞

一個可能的問題在這里:

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);
// ...

如果可能的話,總是最好提供一個完全可編譯的樣本; 如果有時間,人們可以更輕松地實際嘗試采樣。 不要發布所有內容-只是演示問題所需的最低限度。

使用調試器-通過嵌套的for循環跟蹤代碼,並檢查獲取向量索引的值。

(當您使用Eclipse時,雙擊左邊界在一行上設置一個斷點。用於運行到一個斷點。突出顯示一個變量或表達式以觀察並右鍵單擊所選內容,然后從中選擇'Watch'將其添加到監視窗口的菜單。

對於源代碼,Eclipse可能有點無用。 如果您正在學習C ++,我建議您推薦更友好的東西-就個人而言,我建議您使用Visual C ++ Express(免費)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM