0 / 0 / 0
Регистрация: 04.04.2009
Сообщений: 5
|
|
1 | |
Перегрузка оператора +04.04.2009, 20:39. Показов 1361. Ответов 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]
0
|
04.04.2009, 20:39 | |
Ответы с готовыми решениями:
8
Перегрузка оператора Перегрузка оператора + Перегрузка оператора Перегрузка оператора << |
176 / 168 / 27
Регистрация: 12.01.2009
Сообщений: 430
|
|
04.04.2009, 21:18 | 2 |
Если хочешь,чтоб работало правильно ,то либо создай копирующий конструктор,то либо не возвращай локальный объект,а выделяй память под него и возвращай на него указатель
1
|
0 / 0 / 0
Регистрация: 04.04.2009
Сообщений: 5
|
|
04.04.2009, 21:28 [ТС] | 3 |
Большое спасибо в пылу гнева просто не заметил как удалил конструктор копирование.Но вот не подскажете а как он тут используется?
0
|
176 / 168 / 27
Регистрация: 12.01.2009
Сообщений: 430
|
|
04.04.2009, 21:54 | 4 |
return tree;//При выходе из функции объект уничтожается,а значит и массив mas.
Вместо него возвращается новый созданный объект. Раз нет конструктора копирования,то оба объекта указывают на один и тот же массив mas. А вот чтоб скопировать массив в новый объект,а не только указатель,нам и нужен конструктор копирования. Но всетаки лучше в функции выделяй память через new и возвращай указатель.
0
|
0 / 0 / 0
Регистрация: 04.04.2009
Сообщений: 5
|
|
07.04.2009, 22:57 [ТС] | 5 |
Хм а Вам не кажется что виделять память довольно опасно поскольку в момент передачи указателя она уже может быть изменена и вернется непонятно что?
0
|
176 / 168 / 27
Регистрация: 12.01.2009
Сообщений: 430
|
|
07.04.2009, 23:04 | 6 |
0
|
0 / 0 / 0
Регистрация: 04.04.2009
Сообщений: 5
|
|
08.04.2009, 00:08 [ТС] | 7 |
Ну мы возвращаем указатель ведь на память а если эта память будет изменена другой функцией из совершенно другого файла раздельном програмирование.
0
|
176 / 168 / 27
Регистрация: 12.01.2009
Сообщений: 430
|
||||||
08.04.2009, 10:16 | 8 | |||||
Дык тыж почти в каждой функции работаешь с динамически выделяемой памятью.
Взять хотя бы
thread-safe. Это если ты конечно не будешь сам указывать адрес по которому выделять память.
0
|
0 / 0 / 0
Регистрация: 04.04.2009
Сообщений: 5
|
|
08.04.2009, 21:41 [ТС] | 9 |
Хм вроде понял.Все темку можна закрывать.
0
|
08.04.2009, 21:41 | |
08.04.2009, 21:41 | |
Помогаю со студенческими работами здесь
9
Перегрузка оператора + Перегрузка оператора = Перегрузка оператора << Перегрузка оператора << Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |