Форум программистов, компьютерный форум CyberForum.ru

Перегрузка оператора + и = - C++

Восстановить пароль Регистрация
 
eocron
Кактус
 Аватар для eocron
66 / 66 / 6
Регистрация: 23.05.2012
Сообщений: 343
20.03.2013, 12:12     Перегрузка оператора + и = #1
Здравствуйте! Возникла проблема при реализации кода перегрузки операторов. BigInt - это просто класс характеризующий огромные числа в длинной арифметике. В массиве digits, вот такая запись 000123 будет хранится как 321000. Цель: заставить работать вот такое
a=a+b,
или хотя бы вот такое
c=a+b.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
#include <iostream>
#include <string>
 
using namespace std;
 
class BigInt
{
        static const int max_size = 10000;
        char *digits;
public:
          int amount;
          BigInt():amount(0),digits(0)
          {
                   digits=(char *)malloc(sizeof(char)*max_size);
          }
          ~BigInt()
          {
                   free(digits);
          }
          
          friend ostream &operator<<(ostream& output, BigInt& a)
          {
                  a.output(output);
                  return output;
          }
          
          friend istream &operator>>(istream& input, BigInt& a)
          {
                  a.input(input);
                  return input;
          }
          friend BigInt operator+(const BigInt &a, const BigInt &b)
          {
                  BigInt res;
                  res.amount = max(a.amount,b.amount);
                  int r = 0;
                  for (int i=0;i<res.amount | r;i++)
                  {
                        res.digits[i] = a.digits[i] + b.digits[i] + r;
                        if (res.digits[i]>=10)
                        {
                              res.digits[i]-=10;
                              r = 1;
                        }
                        else
                        {
                              r = 0;
                        }
                  }
                  if (res.digits[res.amount])
                  {
                     res.amount++; 
                  }
                  return res;
          }
          BigInt & operator=(BigInt& other)
          {
                 if(this != &other)
                 {
                         memset(digits,0,max_size);
                         amount = other.amount;
                         for(int i=0;i < other.amount;i++)
                         {
                                 digits[i] = other.digits[i];
                         }
                 }
                 return *this;
          }
private: 
          void input(istream& input)
          {
                  memset(digits,0,max_size);
                  string str;
                  input>>str;
                  int pos = 0;
                  for(int i=str.size()-1 ; i>=0 ; i--)
                  {
                      digits[pos++] = str[i] - '0';//Гў îáðГ*ГІГ*îì ïîðÿäêå, äëÿ óäîáñòâГ*
                  }
                  amount = str.size();
          }
          void output(ostream& output)
          {
                      for(int i=amount - 1;i >= 0;i--)
                      {
                              output<<(int)digits[i];
                      }
          }
};
 
int main()
{
    BigInt a;
    BigInt b;
    BigInt c;
    cin>>a;
    cin>>b;
    a+b+a; // работает, проверено
    c=a+b; //не работает, так как локальная переменная возвращаемая при a+b уничтожается.....как решить проблему? при & компилятор ругается на локальность.
    cout<<c<<endl;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.03.2013, 12:12     Перегрузка оператора + и =
Посмотрите здесь:

C++ Перегрузка оператора +=
Перегрузка оператора = C++
Перегрузка оператора * C++
Перегрузка оператора ~ C++
C++ Перегрузка оператора <<
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
20.03.2013, 12:16     Перегрузка оператора + и = #2
Цитата Сообщение от eocron Посмотреть сообщение
C++
1
BigInt & operator=(BigInt& other)
C++
1
BigInt& operator = (const BigInt& other)
eocron
Кактус
 Аватар для eocron
66 / 66 / 6
Регистрация: 23.05.2012
Сообщений: 343
20.03.2013, 12:53  [ТС]     Перегрузка оператора + и = #3
Цитата Сообщение от Jupiter Посмотреть сообщение
C++
1
BigInt& operator = (const BigInt& other)
*_* я в упадке....извините, не подскажите для чего все-таки нужен const в операндах? я давно уже и глубоко углубился в C/c++ а примитивные основы не понимаю для чего...
SummerRain
 Аватар для SummerRain
325 / 324 / 17
Регистрация: 16.12.2012
Сообщений: 544
20.03.2013, 13:48     Перегрузка оператора + и = #4
const гарантирует, что этот объект не будет изменён.
aLarman
636 / 557 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
20.03.2013, 13:51     Перегрузка оператора + и = #5
Цитата Сообщение от eocron Посмотреть сообщение
*_* я в упадке....извините, не подскажите для чего все-таки нужен const в операндах? я давно уже и глубоко углубился в C/c++ а примитивные основы не понимаю для чего...
что бы по невниммательности не изменить этот операнд, ведь он не должен менятся (иначе сломается логика оператора сложения)

Добавлено через 2 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
BigInt operator+(const BigInt &b)
          {
                  BigInt res;
                  res.amount = max(amount,b.amount);
                  int r = 0;
                  for (int i=0;i<res.amount | r;i++)
                  {
                        res.digits[i] = digits[i] + b.digits[i] + r;
                        if (res.digits[i]>=10)
                        {
                              res.digits[i]-=10;
                              r = 1;
                        }
                        else
                        {
                              r = 0;
                        }
                  }
                  if (res.digits[res.amount])
                  {
                     res.amount++; 
                  }
                  return res;
          }
попробуйте так + переопределите конструктор копирования
C++
1
BidInt(const BigInt&)
rangerx
1908 / 1517 / 139
Регистрация: 31.05.2009
Сообщений: 2,876
20.03.2013, 14:04     Перегрузка оператора + и = #6
Цитата Сообщение от eocron Посмотреть сообщение
для чего все-таки нужен const в операндах?
Для того чтобы можно было присваивать и константные объекты.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class SomeClass
{
public:
    SomeClass& operator = (SomeClass& rhs) // принимает только неконстантные объекты
    {        
        return *this;
    }
};
 
int main()
{
    SomeClass a;
    SomeClass b;
    const SomeClass c;
 
    a = b; 
    a = c;            // ошибка
    a = SomeClass();  // ошибка
}
aLarman
20.03.2013, 14:08
  #7

Не по теме:

Цитата Сообщение от rangerx Посмотреть сообщение
C++
1
a = SomeClass(); // ошибка
тут не будет ошибки

Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
20.03.2013, 14:23     Перегрузка оператора + и = #8
Цитата Сообщение от aLarman Посмотреть сообщение
тут не будет ошибки
А если всё-таки проверить?
aLarman
636 / 557 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
20.03.2013, 14:38     Перегрузка оператора + и = #9
проверил MSVS 2010 компилятор не ругнулся
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
20.03.2013, 14:51     Перегрузка оператора + и = #10
Цитата Сообщение от aLarman Посмотреть сообщение
проверил MSVS 2010 компилятор не ругнулся
А теперь, включите уровень предупреждений (/W4) и почитайте, что пишет компилятор:
warning C4239: nonstandard extension used : 'argument' : conversion from 'SomeClass' to 'SomeClass &'
aLarman
20.03.2013, 15:03
  #11

Не по теме:

Цитата Сообщение от rangerx Посмотреть сообщение
C++
1
a = SomeClass(); // ошибка
стоит различать ошибки и предупреждения

Цитата Сообщение от Tulosba Посмотреть сообщение
warning C4239: nonstandard extension used : 'argument' : conversion from 'SomeClass' to 'SomeClass &'

Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
20.03.2013, 15:17     Перегрузка оператора + и = #12
Цитата Сообщение от aLarman Посмотреть сообщение
стоит различать ошибки и предупреждения
Я же даже выделил жирным слово nonstandard. У разных компиляторов могут быть свои особенности. У MS их, как показывает практика, больше чем у других. А опираться при аргументировании кода надо на стандарт, а не на какой-то конкретный компилятор. По стандарту приведенный код является ошибочным.
aLarman
20.03.2013, 15:32
  #13

Не по теме:

может вместо споров дать дельной предложение клиенту, как переработать код, чтобы работал ?

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.03.2013, 15:44     Перегрузка оператора + и =
Еще ссылки по теме:

C++ Перегрузка оператора +
C++ Перегрузка оператора <<
Перегрузка оператора + C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Tulosba
20.03.2013, 15:44     Перегрузка оператора + и =
  #14

Не по теме:

Цитата Сообщение от aLarman Посмотреть сообщение
Не по теме:
может вместо споров дать дельной предложение клиенту, как переработать код, чтобы работал ?
В первом же ответе предложили const использовать. Будьте внимательнее.

Yandex
Объявления
20.03.2013, 15:44     Перегрузка оператора + и =
Ответ Создать тему
Опции темы

Текущее время: 13:00. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru