Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Создание шаблона в C++

44K
03 декабря 2010 года
Mixim
18 / / 01.01.2010
Реализовал шаблон "Множество" на языке C++ в среде C++ Builder. Сделал в нем перегрузку операций "+","-","*" - все работает. Когда же начал пытаться сделать типизированные указатели для данного шаблона(или как это правильно звучит), а затем произвести проделать операции "+","-","*" над ними и получаю: "E2096 Illegal structure operation". Решил добавить перегрузку этих операций для указателей, но ошибка как была, так и осталась. Подскажите пожалуйста, что делаю не так и как избавиться от этой ошибки, участок кода с перегрузкой операции "+", а также "=" привожу ниже:
Код:
template<class T>

class Sets
{
 T value;
   private:
        Sets *Next;
        Sets *Prev;
//некоторые детали реализации(методы, конструкторы и т.д.)
//..........................................

//Перегрузка операции "=" для элемента класса Sets
   Sets<T>  operator=(Sets<T> *MySet)
   {
       Sets<T> *CurSet = MySet->Get_First();
        while(CurSet!=NULL)
        {

           if(CurSet==CurSet->Get_First())
                this->Set_Value(CurSet->Get_Value());

           else
                this->Push(new Sets<T>(CurSet->Get_Value()));

           CurSet=CurSet->Get_Next();
        }
        return *this;
   }
   //================================================


   //Перегрузка операции "+" для элемента класса Sets
   Sets<T>* operator+(Sets<T> MySet)
   {
        Sets<T> *OutSetAdd;
        Sets<T> *currentTHIS = this->Get_First();
        Sets<T> *currentMySet = MySet.Get_First();
        while((currentTHIS!=NULL)||(currentMySet!=NULL))
        {
          if(currentTHIS!=NULL)
          {
                  if(currentTHIS==currentTHIS->Get_First())
                     //OutSetAdd.Set_Value(currentTHIS->Get_Value());
                     OutSetAdd = new Sets<T>(currentTHIS->Get_Value());
                  else
                     OutSetAdd->Push(new Sets<T>(currentTHIS->Get_Value()));
                  currentTHIS=currentTHIS->Get_Next();
          }
          else
              {
               
if[/B((this->Get_Amount()==0)&&(currentMySet==currentMySet->Get_First()))
                {
                    //OutSetAdd.Set_Value(currentMySet->Get_Value());
                    OutSetAdd = new Sets<T>(currentMySet->Get_Value());
                }
                else
                        if(currentMySet!=NULL)
                        {
                            OutSetAdd->Push(new Sets<T>(currentMySet->Get_Value()));
                        }
                currentMySet=currentMySet->Get_Next();
              }
        }
        return OutSetAdd;
   }
   //=================================================

>
376
03 декабря 2010 года
Absolut
220 / / 22.11.2002
В первую очередь что бросилось в глаза, так это путаница с передачей по значению, и через указатель. Например здесь:
 
Код:
Sets<T>  operator=(Sets<T> *MySet)
следует заменить на
 
Код:
Sets<T>&  operator=(const Sets<T>& MySet)

Константная ссылка в аргументе, т.к. MySet не предполагается модифицировать, а возвращение результата по ссылке, чтобы можно было писать цепочки вида:
 
Код:
A = B = C;


Перегрузку "+" лучше сделать вообще не членом класса:
 
Код:
Sets<T> operator+(const Sets<T>& MySet1, const Sets<T>& MySet2)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог