Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> C++. Перегрузка прераций. Двумерный дин. массив.
Airo
сообщение 3.05.2009 - 00:01
Новичок
*

Группа: Участник
Сообщений: 3
Регистрация: 2.05.2009
Пользователь №: 26279


Здравствуйте! Вобщем проблема следующая: есть класс, членом которого является 2-х мерный дин. массив. Нужно перегрузить оператор + и =, чтоб можно было делать

CODE


class MC



{...}

main()
{
MC A(4,6), B, C;

B=A;

C=A+B;
...


вот мой код, который хоть это должен делать... но не делает sad.gif

(программирование учу недавно, так что за корявость кода не судите)

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
Перейти в начало страницы
 
+Цитировать сообщение
Airo
сообщение 3.05.2009 - 20:44
Новичок
*

Группа: Участник
Сообщений: 3
Регистрация: 2.05.2009
Пользователь №: 26279


Так что, никак? sad.gif
Перейти в начало страницы
 
+Цитировать сообщение
Heretic
сообщение 4.05.2009 - 00:56

Частый гость
***

Группа: Участник
Сообщений: 229
Регистрация: 26.09.2004
Пользователь №: 4812


Конструктор копий работает неправильно. Он сгенерирован компилятором и просто копирует указатель, что потом приводит к обращению в освобожденную память.

ARR ARR::operator+(ARR &B)
{
ARR tmp(m1,m2); // ок
...
} // bye -bye


C=A+B; // по C.AR мусор от tmp.AR
Перейти в начало страницы
 
+Цитировать сообщение
Airo
сообщение 4.05.2009 - 14:52
Новичок
*

Группа: Участник
Сообщений: 3
Регистрация: 2.05.2009
Пользователь №: 26279


Heretic, спасибо что показал направление smile.gif С конструктором копирования НЕ по умолчанию я еще не сталкивался, пришлось сесть за учебники... Вот написал, работает:

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
Перейти в начало страницы
 
+Цитировать сообщение

Ответить в данную темуНачать новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



RSS Текстовая версия Сейчас: 23.04.2024 - 10:52