Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.04.2011, 19:02   #1
Lady IcE
 
Аватар для Lady IcE
 
Регистрация: 24.09.2009
Сообщений: 9
Вопрос С++ линейный односвязный список

Здравствуйте. Моя задача состоит в том, что бы создать класс "длинное целое число", которое сохраняется в линейном односвязном списке.
У меня есть вопрос по написанному мной коду. В этой части кода я перегружаю оператор + для моего класса MyList. И проблемы как таковой нет в счислениях - все работает, оно прибавляет два числа правильно. НО!
Дело в том, что если написать
C=А+B;
где, например, А=25 и B=25, то не только с примет значение 50, а и А тоже.
Вот код перегрузки оператора:

Код:
MyList MyList::operator+(const MyList& two)const
 { element*  q1; element* q2; int buf=0, i=0;
   int cn1=Count();
   int cn2=two.Count();
   q1=head;
   q2=two.head;
if (cn1<cn2)
   {  while (i<cn1)
       {q2->val=q2->val+q1->val+buf;
        if (q2->val>=10) {buf=1; q2->val=q2->val-10; } else buf=0;
        q1=q1->next;
        q2=q2->next;
        i++;}
      while (q2!=NULL)
      {if (buf==1) q2->val+=1;
      if (q2->val>=10) {buf=1; q2->val=q2->val-10; } else buf=0;
      q2=q2->next;}
      if (buf==1) two.AddToEnd(1);
      return two;}

else { while (i<cn2)
   {q1->val=q2->val+q1->val+buf;
   if (q1->val>=10) {buf=1; q1->val=q1->val-10; } else buf=0;
   q1=q1->next;
   q2=q2->next;
   i++;
   }
 while (q1!=NULL)
      {if (buf==1) q1->val+=1;
      if (q1->val>=10) {buf=1; q1->val=q1->val-10; } else buf=0;
      q1=q1->next;}
 if (buf==1) AddToEnd(1);
 return *this;}
 }
В списке число сохраняется задом наперед. Тоесть начиная с конца.
Count() - кол-во цифр в списке.
Head - указатель на начало списка.
Ведь const прописан в двух местах. В чем тогда дело? Почему меняется не только С а и А?
Объясните студентке пожалуйста ~
Тра-та-та о_О
^^"
Lady IcE вне форума Ответить с цитированием
Старый 24.04.2011, 19:59   #2
mMAg
Форумчанин
 
Аватар для mMAg
 
Регистрация: 11.08.2009
Сообщений: 433
По умолчанию

Весьма сложно читать код без определения класса. Сжальтесь, выложите описание своего класса.
mMAg вне форума Ответить с цитированием
Старый 25.04.2011, 12:10   #3
Lady IcE
 
Аватар для Lady IcE
 
Регистрация: 24.09.2009
Сообщений: 9
По умолчанию

Код:
struct element { int val;
                 element* next;
               };

class MyList{ element* head;
 public:
 MyList();
 MyList(char*, int);
 MyList(const MyList &First);
 MyList(long int);
 MyList(int);
~MyList();


 MyList& operator=(const MyList&);
 MyList operator+(const MyList&)const;
 MyList operator-(const MyList&)const;
 MyList operator*(const MyList&)const;

 void  Zsuv(int);
 void  Normalisation();
 void  Print()const;
 void  AddToEnd(int);
 bool  IfNull()const;
 int   Count()const;

 element*  ToEnd()const;
};
Тра-та-та о_О
^^"
Lady IcE вне форума Ответить с цитированием
Старый 25.04.2011, 20:24   #4
mMAg
Форумчанин
 
Аватар для mMAg
 
Регистрация: 11.08.2009
Сообщений: 433
По умолчанию

Так все правильно. Формально ваша функция не меняет А. Посмотрите внимательно, все поля какими были, такими и остались. Но она удивительным образом изменяет какой-то там энный элемент в списке, который членом класса не является, вы всего лишь ссылаетесь на тот элемент через указатель. Поэтому у вас складывается впечатление, что функция отрабатывает неправильно. Сама логика неправильна. А с точки зрения языка все нормально.

Вообще, объявляя операцию const вы подразумеваете, что экземпляр класса изменяться не будет (он и не изменяется). Но почему тогда в качестве результата передаете *this? То есть и результат будет равняться первому операнду в операции сложения по вашей логике? Это ведь абсурд.

Поэтому не поленитесть создать еще один экземпляр своего класса внутри операции сложения, запихните в него данные из первого операнда (я вижу, что у вас операция = перегружена, надеюсь, вы там не просто указатели переприсваиваете, а создаете новый экземляр через new), а потом доцепите данные из второго операнда таким же образом.
mMAg вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Линейный-односвязный список Айдар Помощь студентам 1 01.06.2010 10:20
линейный односвязный список на С - что это?? о_О aka_Kiss Помощь студентам 8 22.12.2009 01:39
C++. Односвязный список. Уничтожить список Olya90 Помощь студентам 2 10.06.2009 18:52
Линейный односвязный список Absinth Помощь студентам 4 11.11.2008 20:29
Помогите пож-та.Паскаль. Линейный односвязный список (ЛОС) tonich Паскаль, Turbo Pascal, PascalABC.NET 1 25.02.2008 21:55