Моя программа работает с ошибками перегруженных операторов

Заголовочный файл

#include <iostream>
#include <iomanip>
#include <cstring>
#include <cctype>
using namespace std;

class MyInt
{
  friend ostream& operator<< (ostream& out, const MyInt& myint);
  friend istream& operator>> (istream& in, MyInt& myint);
  friend istream& getline (istream& , MyInt& , char delim = '\n');

  friend MyInt operator+ (const MyInt& x, const MyInt& y);
  friend MyInt operator* (const MyInt& x, const MyInt& y);

  friend MyInt operator++(MyInt& x, int y);     //post-increment ++
  friend MyInt operator++(MyInt& x);            //pre-increment ++
  friend MyInt operator--(MyInt& x);            //pre-decrement --
  friend MyInt operator--(MyInt& x, int y);     //post-decrement --

  friend bool operator< (const MyInt& x, const MyInt& y);
  friend bool operator> (const MyInt& x, const MyInt& y);
  friend bool operator<=(const MyInt& x, const MyInt& y);
  friend bool operator>=(const MyInt& x, const MyInt& y);
  friend bool operator==(const MyInt& x, const MyInt& y);
  friend bool operator!=(const MyInt& x, const MyInt& y);
public:
  MyInt(int n=0);                           // default constructor
  MyInt(const char* number);               // c-style string with digits

  ~MyInt();                          // destructor

  MyInt(const MyInt& );           // copy constructor
  MyInt& operator=(const MyInt& );   // assignment operator
  //MyInt& operator+(const MyInt& x);
  //MyInt& operator*(const MyInt& x);
  int getLength() const;                // return int length



private:

  int current_size;
  int actual_number;
  int max_size;
  char * IntList;
};

Декларация класса

    #include <iostream>
    #include <iomanip>
    #include <cstring>
    #include <cctype>
    #include "myint.h"
    using namespace std;

// friend functions (operatior overloads)

  ostream& operator << (ostream& out, const MyInt& myint){
        for(int i = 0; i < myint.current_size; i ++)
        {
                out << myint.IntList[i];
        }
        return out;
  }
  istream& operator >> (istream& in, MyInt& myint){
        int input;
        in >> input;
        cout << "Input: " << input << endl;
        int digits = 10;
        myint.current_size = 1;
        myint.IntList = new char[myint.current_size];
        myint.IntList[0] = '0';

        myint.actual_number = input;
        if(input >= 0 ){
                int length = 0;
                for(int x = input; x!=0; x /= 10)
                         length++;

                myint.current_size = length;
                for(int i = 0; i < length-2; i++)
                        digits *= 10;
                myint.IntList = new char[myint.current_size];

                myint.IntList[0] = '0' + (input/digits);
                for(int i = length-1; i > 0; i--){
                        myint.IntList[i] = '0' + (input % 10);
                        input/=10;
                }


        }

        return in;
  }


  MyInt::MyInt(int n){
        actual_number = 0;
        int digits = 10;
        current_size = 1;
        IntList = new char[current_size];
        IntList[0] = '0';

        if(n >= 0 ){
                actual_number = n;
                int length = 0;
                for(int x = n; x!=0; x /= 10)
                         length++;

                current_size = length;
                for(int i = 0; i < length-2; i++)
                        digits *= 10;
                IntList = new char[current_size];

                IntList[0] = '0' + (n/digits);
                for(int i = length-1; i > 0; i--){
                        IntList[i] = '0' + (n % 10);
                        n/=10;
                }


        }


  }

  MyInt::MyInt(const char* num){            // conversion from c-string

        current_size = strlen(num);
        IntList = new char[current_size];
        int count = 0;
        int size = 0;
        int j = 0;
        while(isdigit(num[j])){
                count++;
                j++;
        }
       for(int i = 0; i <count; i++)
                IntList[i] = num[i];
       sscanf(IntList, "%d", actual_number);
  }

  MyInt::~MyInt(){

        delete [] IntList;              //deallocate memory
  }

  MyInt::MyInt(const MyInt& copy_int){
        max_size = copy_int.max_size;
        current_size = copy_int.current_size;


        for(int i = 0; i < current_size; i++)
                IntList[i] = copy_int.IntList[i];
  }

   MyInt operator+ (const MyInt& x, const MyInt& y){
        cout << "Adding Ints: " << endl;
        MyInt r;
        r.actual_number = y.actual_number + x.actual_number;
        return r;
  }
  MyInt operator* (const MyInt& x, const MyInt& y){
        cout << "Multiplying Ints: " << endl;
        MyInt r;
        r.actual_number = y.actual_number * x.actual_number;
        return r;

   }

  bool operator< (const MyInt& x, const MyInt& y){
        if(x.actual_number < y.actual_number)
                return true;
        else
                return false;
  }
  bool operator> (const MyInt& x, const MyInt& y){
        cout << "x: " << x.actual_number << "y:" << y.actual_number << endl;
        if(x.actual_number > y.actual_number)
                return true;
        else
                return false;
  }
  bool operator<= (const MyInt& x, const MyInt& y){
        if(x.actual_number <= y.actual_number)
                return true;
        else
                return false;
  }
  bool operator>= (const MyInt& x, const MyInt& y){
        if(x.actual_number >= y.actual_number)
                return true;
        else
                return false;
  }
  bool operator==(const MyInt& x, const MyInt& y){
        if(x.actual_number == y.actual_number)
                return true;
        else
                return false;
  }
  bool operator!=(const MyInt& x, const MyInt& y){
        if(x.actual_number != y.actual_number)
                return true;
        else
                return false;
  }


 MyInt& MyInt::operator=(const MyInt& assign_int ){
        if(this != &assign_int)
        {    
                delete [] IntList;
                this->actual_number = assign_int.actual_number;
                cout << "actual num: " << this->actual_number << endl;

                int digits = 10;
                current_size = 1;
                IntList = new char[current_size];
                IntList[0] = '0';

                if(actual_number >= 0 ){
                        int length = 0;
                        for(int x = actual_number; x!=0; x /= 10)
                                length++;

                        current_size = length;
                        for(int i = 0; i < length-2; i++)
                                digits *= 10;
                        IntList = new char[current_size];

                        IntList[0] = '0' + (actual_number/digits);
                        for(int i = length-1; i > 0; i--){
                                IntList[i] = '0' + (actual_number % 10);
                                actual_number/=10;
                        }
                }

        }
        return *this;

  }

Проблема в моих перегруженных операторах + и *. Я перепробовал все, что мог придумать. Я получаю сообщение об ошибке "Ошибка сегментации (ядро сброшено)" или "Ошибка шины" (ядро сброшено). Я знаю, что это просто то, чего я не вижу, и любая помощь приветствуется!! Спасибо!

2 ответа

Единственная причина, по которой вы видите проблемы с вашим перегруженным operator+() а также operator*() является то, что они возвращаются по значению.

Возврат по значению означает создание копии того, что возвращается. Эта копия будет возвращена вызывающей стороне и (как правило) уничтожена в конце концов.

Фактическая проблема в вашем конструкторе копирования

MyInt::MyInt(const MyInt& copy_int){
    max_size = copy_int.max_size;
    current_size = copy_int.current_size;


    for(int i = 0; i < current_size; i++)
            IntList[i] = copy_int.IntList[i];
}

который не инициализирует IntList указать на что-либо, прежде чем назначить IntList[i] в петле. Результатом этого является неопределенное поведение.

Так как значение, возвращаемое вашими функциями, в конце концов перестанет существовать, будет вызван его деструктор.

MyInt::~MyInt(){

    delete [] IntList;              //deallocate memory
}

который также потому, что IntList не был инициализирован, вызывает неопределенное поведение.

Большой совет: оба ваших других конструктора имеют утверждение IntList = new char[current_size];, Логика может предположить, что конструктору копирования нужно нечто подобное.

Выделите память для IntList в вашем конструкторе копирования.

MyInt::MyInt(const MyInt& copy_int){
    max_size = copy_int.max_size;
    current_size = copy_int.current_size;

    for(int i = 0; i < current_size; i++)
            IntList[i] = copy_int.IntList[i];
}

Ваш код в operator+ а также operator* создает новый объект r чьи члены не инициализированы должным образом, а также в вашем конструкторе копирования члены не копируются должным образом.

Другие вопросы по тегам