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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
bestpalyer1
-1 / 1 / 0
Регистрация: 20.12.2012
Сообщений: 47
#1

Перегрузка += для множества реализованного через массив - C++

07.05.2013, 20:03. Просмотров 269. Ответов 3
Метки нет (Все метки)

Товарищи форумчане, помогите найти ошибку. Если юзать данную перегрузку, то программа завершается аварийно.
зы. По-моему теряется где-то в length.

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
 //Перегрузка оператора +=
 const massiv& massiv::operator+=(const massiv& dub) 
 {
      size=size+dub.size;
      udata = new char [size];
 
      for(int i=0;i<length;i++)
      {udata[i]=data[i];}
 
      for(int i=0;i<length;i++)
      {
          for(int j=0;j<dub.length;j++)
          {
              if(dub.data[j]!=data[i]) 
              {
                  udata[length++] = dub.data[j];
                  length++;
              }
          }
      }
 
      delete [] data;
      data = new char [size];
 
      for(int i=0;i<length;i++)
      {data[i]=udata[i];}
 
      delete [] udata;
      return *this;
 }
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.05.2013, 20:03
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Перегрузка += для множества реализованного через массив (C++):

Перегрузка операторов для класса МАССИВ - C++
Привет. Есть класс &quot;вектор&quot; (&quot;массив&quot;), нужно переопределить операторы =, +, - , *, +=, -=, *= с целым числом. =, +=, -=, *=, как...

Перегрузка оператора запись в поток множества данных - C++
Здравствуйте! Я использую такой код: template&lt;typename T&gt; void operator &gt;&gt; (const T&amp; str) { m_fout &lt;&lt; str &lt;&lt; std::endl; } ...

Верно ли, что для любой пары точек из множества все оставшиеся точки лежат по одну сторону от прямой, проведённой через эту пару - C++
Даны действительные числа x1,....x15, y1,....y15, которые рассматриваются как координаты 15 точек на плоскости. Верно ли, что для каждой из...

R6025 pure virtual function call при вызове метода, реализованного в дочернем классе - C++
Всем привет. Вот такая ошибка у меня возникает при вызове метода, который реализован в дочернем классе, но потом он почему-то становится...

перегрузка через friend, ошибка:( - C++
Почему-то пишет что нету доступа к приватным параметрам, но функция же friend... Пробовал уже по всяякому, никак не прокатывает ...

массив через функцию для начинашек - C++
Задан массив целых чисел. Вывести на экран массив, составленный из элементов, не равных минимальному.

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
anmartex
...
1703 / 1196 / 496
Регистрация: 12.02.2013
Сообщений: 1,978
07.05.2013, 20:18 #2
bestpalyer1, дело совсем не в перегрузке. 10-ая строка - цикл выполняется до length, 16 строка - length++, т.е. i у вас будет принимать значение больше чем реальный размер data. И к тому же у вас почему-то length на 17-ой строчке ещё раз инкрементируется.
bestpalyer1
-1 / 1 / 0
Регистрация: 20.12.2012
Сообщений: 47
07.05.2013, 21:03  [ТС] #3
Цитата Сообщение от anmartex Посмотреть сообщение
bestpalyer1, дело совсем не в перегрузке. 10-ая строка - цикл выполняется до length, 16 строка - length++, т.е. i у вас будет принимать значение больше чем реальный размер data. И к тому же у вас почему-то length на 17-ой строчке ещё раз инкрементируется.
А если так?
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
//Перегрузка оператора +=
 const massiv& massiv::operator+=(const massiv& dub) 
 {
      int f=0,old_length=length;
      size=size+dub.size;
      udata = new char [size];
 
      for(int i=0;i<length;i++)
      {udata[i]=data[i];}
 
      for(int i=0;i<length;i++)
      {
          for(int j=0;j<dub.length;j++)
          {
              f=0;
              if(dub.data[j]!=data[i]) 
              {
                  f=1;
              }
              if(f==1)
              {udata[length++] = dub.data[j];
               old_length++;
              }
          }
      }
      
      delete [] data;
      data = new char [size];
 
      for(int i=0;i<old_length;i++)
      {data[i]=udata[i];}
 
      delete [] udata;
      return *this;
 }
anmartex
...
1703 / 1196 / 496
Регистрация: 12.02.2013
Сообщений: 1,978
08.05.2013, 03:57 #4
bestpalyer1, как я понял, вы хотите из второго массива добавить только те элементы, которые в текущем не встречались? Если я правильно понял, то тогда лучше вот так:
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
const massiv& massiv::operator+=(const massiv& dub)
{
   size = size + dub.size;
   udata = new char [size];
 
   for (int i = 0; i < length; i++)
   {
      udata[i] = data[i];
   }
 
   bool find;
   int old_length = length;
 
   for (int i = 0; i < dub.length; ++j)
   {
      find = false;
      for (int j = 0; (j < old_length) && !find; ++j)
      {
         find = (dub.data[i] == udata[j]);
      }
 
      if (!find)
      {
         udata[length++] = dub.data[i];
      }
   }
 
   delete [] data;
 
   data = udata;
 
   return *this;
}
Обратите внимание, в конце я не выделяю заново память и не переписываю элементы, а просто data присваиваю значение указателя udata. Я ещё не пойму, зачем вспомогательный массив udata вы сделали членом класса (т.е. полем)? Можно было просто локально объявить и это было бы более правильным.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.05.2013, 03:57
Привет! Вот еще темы с ответами:

Перегрузка оператора инкремента/декремента через friend - C++
Нужно реализовать перегрузку унарного оператора через friend. Что я пытаюсь сделать: friend void operator -- ();//prototype void...

Класс Octal для работы с восьмеричными числами (через массив) - C++
Есть ли у кого реализация класса Octal для работы с восьмеричными числами? Через массив. Если исходник реализации через вектор. А нужно...

Шаблоны и дружественность. Перегрузка оператора << через дружественную функцию в шаблоне - C++
Доброго времени суток, уважаемые форумчане! Есть класс-шаблон, реализующий объект &quot;Матрица&quot;. Для него перегружены некоторые операторы....

Двумерный массив и перегрузка оператора = - C++
Скажите пожалуйста как правильно перегрузить для моего класса оператор = ? template&lt;typename TT&gt; class Matrix { public:...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
08.05.2013, 03:57
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru