C++. Перегрузка прераций. Двумерный дин. массив. |
Здравствуйте, гость ( Вход | Регистрация )
C++. Перегрузка прераций. Двумерный дин. массив. |
3.05.2009 - 00:01
Вставить ник | Быстрая цитата | Сообщение
#1
|
|
Новичок Группа: Участник Сообщений: 3 Регистрация: 2.05.2009 Пользователь №: 26279 |
Здравствуйте! Вобщем проблема следующая: есть класс, членом которого является 2-х мерный дин. массив. Нужно перегрузить оператор + и =, чтоб можно было делать
CODE class MC {...} main() { MC A(4,6), B, C; B=A; C=A+B; ... вот мой код, который хоть это должен делать... но не делает (программирование учу недавно, так что за корявость кода не судите) CODE #include <iostream.h> #include <windows.h> #include <stdlib.h> class ARR{ int **AR, m1, m2; public: ARR(int mm1=5, int mm2=5); ~ARR(){delete [] AR;}; void initAr(); void show(); int* operator[](int index); //Возвращает указатель на строку. ARR operator+(ARR &B); void operator=(ARR &B); }; ARR::ARR(int mm1, int mm2){ if(mm1>0&&mm2>0){ m1=mm1; m2=mm2; }else {m1=5; m2=5;} AR=new int*[m1]; if(!AR) {cout<<"\nПАМЯТЬ НЕ ВЫДЕЛЕНА!!!!!\n"; exit(0);} for(int i=0;i<m1;i++) AR[i]=new int[m2]; } int* ARR::operator[](int index){ if(index<0||index>=m1) {cout<<"\nОШИБКА!! Неверный индекс!!\n"; return 0;} return AR[index]; } ARR ARR::operator+(ARR &B) { ARR tmp(m1,m2); tmp.show(); if(m1!=B.m1||m2!=B.m2) {cout<<"\nОШИБКА!! Размерность массивов не одинакова.\n"; return tmp;} for(int i=0; i<B.m1;i++){ for(int j=0;j<B.m2;j++){ tmp[i][j]=AR[i][j]+B[i][j]; } } return tmp; } void ARR::operator=(ARR &B) { if(m1!=B.m1||m2!=B.m2) { delete []AR; AR=new int*[B.m1]; if(!AR) {cout<<"\nПАМЯТЬ НЕ ВЫДЕЛЕНА!!!!!\n"; exit(0);} for(int i=0;i<B.m1;i++) AR[i]=new int[B.m2]; m1=B.m1; m2=B.m2; } for(int i=0; i<m1;i++) for(int j=0;j<m2;j++) AR[i][j]=B[i][j]; } void ARR::initAr(){ int k=0; for(int i=0; i<m1;i++) for(int j=0;j<m2;j++) AR[i][j]=++k; } void ARR::show(){ for(int i=0; i<m1;i++){ for(int j=0;j<m2;j++) cout<<AR[i][j]<<'\t'; cout<<"\n\n"; } } ///////////////////////////////////////////////////// int main(){ SetConsoleCP(1251); SetConsoleOutputCP(1251); ARR A(4, 7), B, C; A.initAr(); B=A; B.show(); //C=A+B; //C.show(); return 0; } ///////////////////////////////////////////////////// Если раскаментировать в main() строку С=А+В; То вылетает при выполнении.. PS Пользуюсь вижуал студией. Сообщение отредактировано Airo - 3.05.2009 - 00:08 |
|
|
3.05.2009 - 20:44
Вставить ник | Быстрая цитата | Сообщение
#2
|
|
Новичок Группа: Участник Сообщений: 3 Регистрация: 2.05.2009 Пользователь №: 26279 |
Так что, никак?
|
|
|
4.05.2009 - 00:56
Вставить ник | Быстрая цитата | Сообщение
#3
|
|
Частый гость Группа: Участник Сообщений: 229 Регистрация: 26.09.2004 Пользователь №: 4812 |
Конструктор копий работает неправильно. Он сгенерирован компилятором и просто копирует указатель, что потом приводит к обращению в освобожденную память.
ARR ARR::operator+(ARR &B) { ARR tmp(m1,m2); // ок ... } // bye -bye C=A+B; // по C.AR мусор от tmp.AR |
|
|
4.05.2009 - 14:52
Вставить ник | Быстрая цитата | Сообщение
#4
|
|
Новичок Группа: Участник Сообщений: 3 Регистрация: 2.05.2009 Пользователь №: 26279 |
Heretic, спасибо что показал направление С конструктором копирования НЕ по умолчанию я еще не сталкивался, пришлось сесть за учебники... Вот написал, работает:
ARR::ARR(ARR& T) // конструктор копирования.. { AR=new int*[T.m1]; for(int i=0;i<T.m1;i++) AR[i]=new int[T.m2]; for(i=0; i<T.m1;i++) for(int j=0;j<T.m2;j++) AR[i][j]=T[i][j]; m1=T.m1; m2=T.m2; } Еще раз тенкс.. Сообщение отредактировано Airo - 4.05.2009 - 15:03 |
|
|
Текстовая версия | Сейчас: 23.04.2024 - 10:52 |