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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.78
immortal
0 / 0 / 0
Регистрация: 04.04.2009
Сообщений: 5
#1

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

04.04.2009, 20:39. Просмотров 1062. Ответов 8
Метки нет (Все метки)

В общем проблема в том что я не могу правильно перегрузить оператор точнее могу но ошибки работы с памятью появляются вот код .Оператор + должен добавлять два масива так что бы одинаковые элементы не повторялись.
Код полностью компилируется но после ввода двух масивов вылетает ошибка Debug Asseraation Failled!
Код
[CPP]#include"head.h"
void main()
{
//--------------Cоздание "пустых" объектов-------
Array one,two,tree; 
 cout<<endl<<"Input array"<<endl;    
  cin>>two;
   cout<<endl<<"Input array"<<endl;
    cin>>tree;
     one=two+tree;
	  cout<<"\n\t~~~Integration~~~\n";     
	     cout<<endl<<one<<endl;
cin.get();
cin.get();
}
#include<iostream>
#include<fstream>
#include<string>
using namespace std;
//-------------------Первый класс---------------------
class Element
{
private:
	char element;
public:
 char check2();
Element& operator =(const char& elem)
{
element=elem;
return *this;
}
friend istream& operator>>(istream& cin,Element& a);
friend ostream& operator<<(ostream& s,const Element& a);
};			

ostream& operator<<(ostream& s,const Element& a)
{
	s<<a.element;
	return s;
}

istream& operator>>(istream& cin,Element& a)
{
	cin>>a.element;
	return cin;
}
char Element::check2()
{
 return element;
}
class Array
{
private://Закрытая область
    Element* mas;
	int b;
public:
//-----------Список конструкторов---------------------
Array()
{
b=5;
mas=new Element [b];
}; 
friend istream& operator>>(istream& cin,Array& a);
friend ostream& operator<<(ostream& cout,const Array& a);
Array& operator =(const Array& one);
friend Array operator+ (const Array& one,const Array& two);
/*friend Array operator* (const Array& one,const Array& two);
friend Array operator- (const Array& one,const Array& two);*/
~Array()
{	
delete [] mas;
};
};
ostream& operator<<(ostream& cout,const Array& a)
{
	int i;
	for(i=0;i<a.b;i++)
	{
	cout<<a.mas[i];
	}
	return cout;
}

istream& operator>>(istream& cin,Array& a)
{
	int i;
	for(i=0;i<a.b;i++)
	{
		cin>>a.mas[i];
	}
	return cin;
}
Array operator +(const Array& one,const Array& two)
{
 Array tree;
 delete [] tree.mas;
 int p,l=0,j,i;
 tree.b=one.b+two.b;
 tree.mas=new Element[tree.b];
 for(i=0;i<one.b;i++)
 {
	 tree.mas[i]=one.mas[i];
 }
 for (i=0;i<two.b;i++)
 {
 p=-9;
	 for (j=0;j<one.b;j++)
		 {	  
	 if (two.mas[i].check2()==one.mas[j].check2()) 
	p=j;	 
	     }	
	 if(p==-9)	
	{
		l++;
	    tree.mas[l+one.b-1]=two.mas[i];
	}
 }
tree.b=one.b+l;
return tree;
}
Array& Array::operator =(const Array& one)
{
 delete [] mas;
   b=one.b;
   int i;
mas=new Element[b];
  for(i=0;i<b;i++)
  {
	  mas[i]=one.mas[i];
  }
 return *this;
}
/*Array operator *(const Array& one,const Array& two)
{
 Array tree;
 delete [] tree.mas;
 tree.mas=new Element[tree.b];
 int i,z=00,j;
 for(i=0;i<one.b;i++)
 {
 for(j=0;j<two.b;j++)
 {
 if (one.mas[i].check2()==two.mas[j].check2()){tree.mas[z]=one.mas[i];z++;}
 }
 }
 tree.b=z;
 return tree;
delete [] tree.mas;
}

Array operator -(const Array& one,const Array& two)
{
 Array tree;
 delete [] tree.mas;
 tree.mas=new Element[tree.b];
 int i,z=0,p=0,j;
  for(i=0;i<one.b;i++)
 {
for(j=0;j<two.b;j++)
 {
 if (one.mas[i].check2()!=two.mas[j].check2())p++;
}
if (p==two.b){tree.mas[z]=one.mas[i];z++;}
 p=0;
 } tree.b=z;
 return tree;
delete [] tree.mas;
}

*/
//-------------------Функции второго класса-----------
/*template<class T>void Array<T>::check()
{
int i;
	for(i=0;i<b;i++)
{
	cout<<mas[i];
}
cout<<endl;
char element1;
cout<<"\tEnter element \n";
 cin>>element1;
	int p=0;
  for(i=0;i<b;i++)
	{
cout<<mas[i];	
		if(mas[i].check1(element1)==0) p++;
	}
     if(p==0)cout<<"\tThere isn't element in the array\n";
      if(p==1) cout<<"\tThere is 1 element in the array\n";
       if(p>1) cout<<"\tThere are "<<p<<" elemnts in the array\n"; 
addition();
}
template<class T>void Array<T>::addition()
{
string f;
char element2;
 int position,i;
  T* mas1=new T [b+1];
   cout<<"\tWould you like to add element[yes/no]\n";
    cin>>f;
   	  if(f=="yes")
	   {
		cout<<"\tEnter new element and his position\n";
		 cin>>element2>>position;
		  position=position-1; 
		   for(i=0;i<=position-1;i++)
	         {
		      mas1[i]=mas[i];
	         }
	     	 mas1[position]=element2;
	           for(i=position+1;i<=b;i++)
	            {  
		         mas1[i]=mas[i-1];
	            }
	           delete [] mas;
		       T* mas=new T [b+1];
			    for(i=0;i<=b;i++)
	             {
		          mas[i]=mas1[i];
                 cout<<mas[i];
				 }
				  cout<<endl;
	             deletting(b);
	    }
	else deletting(b);
delete [] mas1;
}
template<class T>void Array<T>::deletting(int b)
{
string d;
int i; 
cout<<"\tWould you like to delete element[yes/no]\n";
  cin>>d;
 if(d=="yes")
   {
T* mas1=new T[b];	
char element3;
int position2,j=0,z,f=0;
     cout<<"\tEnter element\n";
	  cin>>element3;
	  for(z=0;z<=b-j;z++)
	  {
		  if (mas[z].check1(element3)==0)
		  {
			  j++;
			  position2=z;
		      z=z-1;
		 for(i=0;i<=position2-1;i++)
	      {
		    mas1[i]=mas[i];
          }
		  mas1[position2]=mas[position2+1];
		  for(i=position2+1;i<=b-j;i++)
	        {
		     mas1[i]=mas[i+1];
             }
           delete [] mas;
		  T* mas=new T [b];	
	       for(i=0;i<=b-j;i++)
	          {
		       mas[i]=mas1[i];
              }
		  }  
	   }
	 cout<<"\tResult\n";
	  for(i=0;i<=b-j;i++)
	          {
				 cout<<mas[i];
	          }	
       delete [] mas1;         
	  cout<<endl;
	 cout<<"\tEnd of program\n"; 
   	 
   }
   else cout<<endl<<"\tEnd of program\n";
};*/
[/CPP]
Про - * я сам разберусь если смогу понять что с + не так.Оч обидно програма полностью работала но стукнуло мне в голову шаблоны сделать после неудачной попытки реализовать это не получилось востановить исходный код.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Humanitis
 Аватар для Humanitis
172 / 164 / 6
Регистрация: 12.01.2009
Сообщений: 430
04.04.2009, 21:18     Перегрузка оператора + #2
Цитата Сообщение от immortal Посмотреть сообщение
Array operator +(const Array& one,const Array& two)
{
Array tree;//локальный объект
delete [] tree.mas;
int p,l=0,j,i;
tree.b=one.b+two.b;
tree.mas=new Element[tree.b];
for(i=0;i<one.b;i++)
{
tree.mas[i]=one.mas[i];
}
for (i=0;i<two.b;i++)
{
p=-9;
for (j=0;j<one.b;j++)
{
if (two.mas[i].check2()==one.mas[j].check2())
p=j;
}
if(p==-9)
{
l++;
tree.mas[l+one.b-1]=two.mas[i];
}
}
tree.b=one.b+l;
return tree;//При выходе из функции объект уничтожается,а значит и массив mas.
}

[/CPP][/CODE]
Если хочешь,чтоб работало правильно ,то либо создай копирующий конструктор,то либо не возвращай локальный объект,а выделяй память под него и возвращай на него указатель
immortal
0 / 0 / 0
Регистрация: 04.04.2009
Сообщений: 5
04.04.2009, 21:28  [ТС]     Перегрузка оператора + #3
Большое спасибо в пылу гнева просто не заметил как удалил конструктор копирование.Но вот не подскажете а как он тут используется?
Humanitis
 Аватар для Humanitis
172 / 164 / 6
Регистрация: 12.01.2009
Сообщений: 430
04.04.2009, 21:54     Перегрузка оператора + #4
return tree;//При выходе из функции объект уничтожается,а значит и массив mas.
Вместо него возвращается новый созданный объект. Раз нет конструктора копирования,то оба объекта указывают на один и тот же массив mas. А вот чтоб скопировать массив в новый объект,а не только указатель,нам и нужен конструктор копирования.

Но всетаки лучше в функции выделяй память через new и возвращай указатель.
immortal
0 / 0 / 0
Регистрация: 04.04.2009
Сообщений: 5
07.04.2009, 22:57  [ТС]     Перегрузка оператора + #5
Цитата Сообщение от Humanitis Посмотреть сообщение
Но всетаки лучше в функции выделяй память через new и возвращай указатель.
Хм а Вам не кажется что виделять память довольно опасно поскольку в момент передачи указателя она уже может быть изменена и вернется непонятно что?
Humanitis
 Аватар для Humanitis
172 / 164 / 6
Регистрация: 12.01.2009
Сообщений: 430
07.04.2009, 23:04     Перегрузка оператора + #6
Цитата Сообщение от immortal Посмотреть сообщение
в момент передачи указателя она уже может быть изменена
Я этого не понимай,что это значит?
immortal
0 / 0 / 0
Регистрация: 04.04.2009
Сообщений: 5
08.04.2009, 00:08  [ТС]     Перегрузка оператора + #7
Ну мы возвращаем указатель ведь на память а если эта память будет изменена другой функцией из совершенно другого файла раздельном програмирование.
Humanitis
 Аватар для Humanitis
172 / 164 / 6
Регистрация: 12.01.2009
Сообщений: 430
08.04.2009, 10:16     Перегрузка оператора + #8
Дык тыж почти в каждой функции работаешь с динамически выделяемой памятью.
Взять хотя бы
C++
1
mas=new Element [b];
И ты наверное имел ввиду многопоточное приложение,а не параллельное программирование. Так вот с ним проблем не должно быть,так как выделяешь память не под глобальную переменную. Да и операторы new и delete вроде являются
thread-safe. Это если ты конечно не будешь сам указывать адрес по которому выделять память.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.04.2009, 21:41     Перегрузка оператора +
Еще ссылки по теме:

Перегрузка оператора ~ C++
Перегрузка оператора = C++
C++ Перегрузка оператора +
C++ Перегрузка оператора ->
Перегрузка оператора << C++

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

Или воспользуйтесь поиском по форуму:
immortal
0 / 0 / 0
Регистрация: 04.04.2009
Сообщений: 5
08.04.2009, 21:41  [ТС]     Перегрузка оператора + #9
Хм вроде понял.Все темку можна закрывать.
Yandex
Объявления
08.04.2009, 21:41     Перегрузка оператора +
Ответ Создать тему
Опции темы

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