Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
Кактус
 Аватар для eocron
67 / 67 / 19
Регистрация: 23.05.2012
Сообщений: 342

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

20.03.2013, 12:12. Показов 2234. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! Возникла проблема при реализации кода перегрузки операторов. 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;
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
20.03.2013, 12:12
Ответы с готовыми решениями:

Перегрузка оператора ==
Я уже встречала подобный вопрос на этом форуме, но у меня всё равно что-то не получается Вот виртуальная ф-ция, которую я вызываю в...

Перегрузка оператора ^
Здравствуйте! Необходимо перегрузить бинарный оператор ^ для транспонирования матрицы. Есть класс матрицы: template &lt;class T&gt; ...

Перегрузка оператора +
Написал для перегрузки оператора + class BoolMatrix { private: int feet; public: BoolMatrix(int f): feet(f) {} ...

13
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
20.03.2013, 12:16
Цитата Сообщение от eocron Посмотреть сообщение
C++
1
BigInt & operator=(BigInt& other)
C++
1
BigInt& operator = (const BigInt& other)
1
Кактус
 Аватар для eocron
67 / 67 / 19
Регистрация: 23.05.2012
Сообщений: 342
20.03.2013, 12:53  [ТС]
Цитата Сообщение от Jupiter Посмотреть сообщение
C++
1
BigInt& operator = (const BigInt& other)
*_* я в упадке....извините, не подскажите для чего все-таки нужен const в операндах? я давно уже и глубоко углубился в C/c++ а примитивные основы не понимаю для чего...
0
 Аватар для SummerRain
328 / 327 / 92
Регистрация: 16.12.2012
Сообщений: 544
20.03.2013, 13:48
const гарантирует, что этот объект не будет изменён.
0
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
20.03.2013, 13:51
Цитата Сообщение от 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&)
1
2022 / 1621 / 489
Регистрация: 31.05.2009
Сообщений: 3,005
20.03.2013, 14:04
Цитата Сообщение от 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();  // ошибка
}
0
20.03.2013, 14:08

Не по теме:

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

0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
20.03.2013, 14:23
Цитата Сообщение от aLarman Посмотреть сообщение
тут не будет ошибки
А если всё-таки проверить?
0
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
20.03.2013, 14:38
проверил MSVS 2010 компилятор не ругнулся
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
20.03.2013, 14:51
Цитата Сообщение от aLarman Посмотреть сообщение
проверил MSVS 2010 компилятор не ругнулся
А теперь, включите уровень предупреждений (/W4) и почитайте, что пишет компилятор:
warning C4239: nonstandard extension used : 'argument' : conversion from 'SomeClass' to 'SomeClass &'
1
20.03.2013, 15:03

Не по теме:

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

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

0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
20.03.2013, 15:17
Цитата Сообщение от aLarman Посмотреть сообщение
стоит различать ошибки и предупреждения
Я же даже выделил жирным слово nonstandard. У разных компиляторов могут быть свои особенности. У MS их, как показывает практика, больше чем у других. А опираться при аргументировании кода надо на стандарт, а не на какой-то конкретный компилятор. По стандарту приведенный код является ошибочным.
0
20.03.2013, 15:32

Не по теме:

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

0
20.03.2013, 15:44

Не по теме:

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

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
20.03.2013, 15:44
Помогаю со студенческими работами здесь

перегрузка оператора!
Помогите сложить диагонали , при помоши перегрузки оператора+, чтобы можно было написать в maine: c1+c2+c3.заранее спасибо! ...

Перегрузка оператора +
Добрый день)Почему то не работает перегрузка оператора сложения) #include &lt;iostream&gt; #include &lt;string&gt; #include...

Перегрузка оператора +
не получается в своем классе перегрузить оператор + :( пишет &quot;error C2804: бинарный &quot;operator +&quot; имеет слишком много...

Перегрузка оператора new[]
Привет всем, программирую давольно давно, на с++ второй год. Столкнулся с задачей, в которой нужно создать свой класс и корректно в нем...

Перегрузка оператора >
Добрый день! #include &lt;stdio.h&gt; #include &lt;tchar.h&gt; #include &lt;iostream&gt; template &lt;typename T1, typename T2&gt; bool ...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru