Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> перегрузка +, для матриц 
:(
    Опции темы
baldina
Дата 20.4.2008, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 32
Всего: 101



Будет работать, если здесь  
Код

Matrix M1(2,1), M2(2,1), M3;

задашь размерность M3:
Код

Matrix M1(2,1), M2(2,1), M3(2,1);


PM MAIL   Вверх
student0511
Дата 20.4.2008, 15:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 26.3.2006

Репутация: нет
Всего: нет



Ну да, работает, а почему не пашет, если не задавать размер?
PM MAIL   Вверх
vinter
Дата 20.4.2008, 17:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



для этог случая у тебя будет всегда
Код

else
         cout<<"Wrong size!!!";

т.к в дефолтовом конструкторе ты обнуляешь n, m

Добавлено через 2 минуты и 5 секунд
вообще у тебя неправильно написан класс, сам допускаешь возможность NULL указателя при  присваивании, а никак это не проверяешь. Либо проверяй это, либо уберай дефолтовый конструктор в private.


--------------------
Мой блог
PM MAIL WWW   Вверх
student0511
Дата 21.4.2008, 00:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 26.3.2006

Репутация: нет
Всего: нет



Всё. Исправил. Работает. smile
Вот код 
Код

#include <iostream>
using namespace std;
////////////////////
class Matrix
{
 private:
     int** MX;
     int n;
     int m;
 public:
     /////***Designer***//////////////
     Matrix(Matrix& mx)
     {
      int i(0), j(0);
      n = mx.n;
      m = mx.m;
      MX = new int*[n];
      for(i = 0; i<n; i++)
          MX[i] = new int[m];
      for(i = 0; i<n; i++)
          for(j = 0; j<m; j++)
              MX[i][j] = (mx.MX)[i][j];
     }
     ///////////////////
     Matrix(): MX(NULL), n(0), m(0)
     {}
     Matrix(int N, int M): n(N), m(M)
     {
         MX = new int* [n];
         for(int i = 0; i<n; i++)
             MX[i] = new int[m];
     }
     //////***METHODS***/////////
     void input();
     /////////////
     void show() const;
     ///////////////////////////// 
     void operator=(const Matrix);
     //////////////////////////////
     Matrix operator+=(const Matrix&);
     //////////////////////////////// 
     Matrix operator+(const Matrix);
     ////////////////////////////////
     Matrix operator-=(const Matrix&);
     //////////////////////////////// 
     Matrix operator-(const Matrix);
     //////***Destructor***//////////
     ~Matrix()
     {
      for(int i = 0; i<n; i++)
          delete [] *(MX + i);
      delete MX;
     }
};
///////////////////////////////////////////////////////
//////////****METHODS***///////////////////////////////
///////////////////////////////////////////////////////
void Matrix::input ()
{
 for(int i = 0; i<n; i++)
  {
   for(int j = 0; j<m; j++)
      {
       cout<<"MX["<<i<<"]["<<j<<"] = ";
       cin>>MX[i][j];
      }
   cout<<endl;
  }
}
////////////////////////////////////////////
void Matrix::show() const
{
 for(int i = 0; i<n; i++)
    {
     for(int j = 0; j<m; j++)
         cout<<MX[i][j]<<" ";
     cout<<endl;
    }
}
///////////////////////////////////////
void Matrix::operator= (const Matrix M)
{
 if(!MX)
 {
  n = M.n;
  m = M.m;
  MX = new int* [n];
  for(int i = 0; i<n; i++)
     MX[i] = new int[m];
 }
 if(&M != this)
    {
     if(M.n == n && M.m == m)
      {
       for(int i = 0; i<n; i++)
          for(int j = 0; j<m; j++)
             *(*(MX + i) + j) = *(*((M.MX)+i)+j);
      }
      else
         cout<<"Wrong size!!!";
     }
}
///////////////////////////////////////////////////
Matrix Matrix::operator+= (const Matrix& M) 
{
 if(M.n == n && M.m == m)
    {
     for(int i = 0; i<n; i++)
        for(int j = 0; j<m; j++)
            MX[i][j]+=(M.MX)[i][j];
    }
 return *(this);
}
//////////////////////////////////////////
Matrix Matrix::operator-= (const Matrix& M)
{
 if(M.n == n && M.m == m)
    {
     for(int i = 0; i<n; i++)
        for(int j = 0; j<m; j++)
            MX[i][j]-=(M.MX)[i][j];
    }
 return *(this);
}
///////////////////////////////////////////
Matrix Matrix::operator+ (const Matrix rM)
{
 Matrix temp(*this);
 return (temp += rM);
}
//////////////////////////////////////////
Matrix Matrix::operator- (const Matrix rM)
{
 Matrix temp(*this);
 return (temp -= rM);
}
///////////////////////////////////////////////////////
int main()
{
 Matrix M1(2,1), M2(2,1), M3;
 
 M1.input();
 M1.show();

 cout<<endl;

 M2.input();
 M2.show();

 M1 = M2;

 cout<<endl;

 M1.show();

 M3 = (M1 + M2);

 cout<<endl<<"????"<<endl;
 M3.show();

 cout<<"***";
 return 0;
}

    Вот только некоторые вопросы остались: а обязательно при создании operator ('+' или '-', '+=' или '-=') результат возвращать по ссылке и передавать, и что это даёт? Хотя убрал ссылки с operator'ов + и - : всё работает вроде как надо, а убрал передачу аргумента по ссылке в += и -=, то уже никак. В чём проблема? И ещё один вопрос: как применить конструктор к указателю this и возможно ли это? А то в operator= лишний код дублируется, хотелось бы так: (*(this))(M.n, M.m), - компиллятор выдает ошибку "error C2064: term does not evaluate to a function". :-( 

Это сообщение отредактировал(а) student0511 - 21.4.2008, 00:30
PM MAIL   Вверх
vinter
Дата 21.4.2008, 07:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



student0511, читай книги.


--------------------
Мой блог
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0498 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.