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

Поиск:

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


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

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



а как же
Цитата(Maryann @  23.1.2008,  19:29 Найти цитируемый пост)
выполнеяемые действия, приводящие к краху.

?
что вводим,

Добавлено через 10 секунд
????


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
Maryann
Дата 23.1.2008, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



целые числа . Например 1 2 3
PM MAIL   Вверх
archimed7592
Дата 23.1.2008, 15:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

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



Цитата(Maryann @  23.1.2008,  15:29 Найти цитируемый пост)
перед m3=m1+m2 - ошибка

В чём точно заключается ошибка?

Цитата(Maryann @  23.1.2008,  15:29 Найти цитируемый пост)
я его перегрузила так:

Не надо его перегружать!

Цитата(Maryann @  23.1.2008,  15:39 Найти цитируемый пост)
целые числа . Например 1 2 3 

По моим расчётам нужно вводить 8 чисел...



--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
warmonger_
Дата 23.1.2008, 16:07 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 7.7.2007
Где: г. Киев

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



Код

#include<iostream>
using std::cin;
using std::cout;

class matrix
{
     int size; int A[20][20];
     public:
      matrix(int n=1): size(n) { }
          ~matrix(){ }
          void vvod();
          void vivod();
          matrix operator+(const matrix &o2);
};
void matrix::vvod()
{
    cout<<"Enter "<<size*size<<" chisel \n";
    for(int i=0;i<size ;i++ )
        for(int j=0;j<size;j++)
        cin>>A[i][j];
}
void matrix::vivod()
{
    for(int i=0;i<size ;i++ )
        for(int j=0;j<size;j++)
        cout<<A[i][j];
}
matrix matrix::operator+(const matrix &o2)
{
     matrix temp(size);
          for (int i=0; i<size;i++)
                {for(int j=0;j<size; j++)
                     temp.A[i][j]=A[i][j]+o2.A[i][j];
                     cout<<"\n";
                }
     return temp;
}
int main(int argc, char **argv)
{
    matrix m1(2); matrix m2(2);
    m1.vvod(); m2.vvod();
    matrix m3(2); m3=m1+m2;
    m3.vivod();
    cout<<"\n";
    
    return 0;
}





Maryann,  проверил этот код. работает.
вывод:
Код

Enter 4 chisel
1 2 3 4
Enter 4 chisel
4 3 2 1


5555



и должно работать.

Это сообщение отредактировал(а) warmonger_ - 23.1.2008, 16:09
--------------------
Make everything as simple as possible, but not simpler.Albert Einstein
PM MAIL   Вверх
Maryann
Дата 23.1.2008, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата

В чём точно заключается ошибка?


вылетает сообщение gpe, ничего конкретного не говорится
Цитата

По моим расчётам нужно вводить 8 чисел...


да, 8: 1 2 3 4 1 2 3 4 например.

Добавлено через 1 минуту и 58 секунд
Цитата

Maryann,  проверил этот код. работает.


это хорошо. Хорошо еще, что на экзамене компилировать не надо будет...эх
PM MAIL   Вверх
archimed7592
Дата 23.1.2008, 19:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

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



Maryann, Вы можете назвать компилятор? Уже не в первый раз просим...


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
warmonger_
Дата 23.1.2008, 19:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 7.7.2007
Где: г. Киев

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



archimed7592, 
Цитата(Maryann @  20.1.2008,  17:12 Найти цитируемый пост)
Borland C++, version 4.5 copyright 1991, 1994

уже называли...
--------------------
Make everything as simple as possible, but not simpler.Albert Einstein
PM MAIL   Вверх
JackYF
Дата 23.1.2008, 20:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

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



Цитата(warmonger_ @  23.1.2008,  18:24 Найти цитируемый пост)
version 4.5 copyright 1991, 1994

неужели автору не кажется, что он "малёхо" староват?


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
student0511
Дата 20.4.2008, 00:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Вот тоже проблемы, подобного типа, при перегрузки операции + возвращает не готовый элемент, а элемент после удаления. Вот полный код:
Код

#include <iostream>
using namespace std;
////////////////////
class Matrix
{
 private:
     int** MX;
     int n;
     int m;
 public:
     Matrix( ): MX(NULL)
     {}
     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];
     }
     /////////////////////////////
     void input();
     //////////////
     void show() const;
     //////////////////////////
     Matrix operator=(Matrix M);
     //////////////////////////
         Matrix operator+(Matrix M);
     //////***Destruct***//////
     /*~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;
    }
}
///////////////////////////////////
Matrix Matrix::operator= (Matrix 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!!!";
     }
 return *this;
}
///////////////////////////////////////////////////
Matrix Matrix::operator+ (Matrix M)
{
 Matrix temp(n, m);
 if(M.n == n && M.m == m)
  {
   for(int i = 0; i<n; i++)
      for(int j = 0; j<m; j++)
         *(*((temp.MX)+ i) + j) = *(*(MX + i) + j) + *(*((M.MX)+i)+j);
  }
  else
     cout<<"Wrong size!!!";
 return temp;
}
///////////////////////////////////////////////////////
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;
}

Ошибок не выдаёт, но поля элемента M3 представляет не окончательный вариант, а вот что: 

MX: 0x00000000 -> CXX0030: Error: expression cannot be evaluated
n: -858993460
m: -858993460

Компилятор: Visual C++ 6 1994 - 1998 г. 

А если добавить деструктор, то вообще вылетает с ошибкой. 


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


Explorer
****


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

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



конструктор копирования определи. А вообще лучше определить в класе операции тип *=, где * это тип операции, и определить свободные ф-ии где эти операторы и будут вызваться. Но конструктор копирования в данном случае все равно необходим.


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


Новичок



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

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



Чё-то я не догнал, а где использовать конструктор копирования? Вот я создаю temp, в последствии его поля заполняются как надо, но когда возвращается значение из функции, результат почему-то исчезает, т.е. он не переходит в M3, почему? Я же объявил конструктор, где выделяется память под необходимое поле (MX). И не очень мне ясно, что вы упомянули о свободных функциях и операциях тип *=, если можно по-подробнее, то очень бы хотелось. Заведомо премного благодарен!

Добавлено через 9 минут и 59 секунд
Ну вот я написал конструктор копирования:
Код

 Matrix(Matrix& mx)
     {
      MX = mx.MX;
      n = mx.n;
      m = mx.m;
     }

но тогда operator= не вызывается, а  в выражении M3 = M1 + M2 вызывается сразу этот самый конструктор, не дав поработать operator+ 'у. 
PM MAIL   Вверх
vinter
Дата 20.4.2008, 09:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


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

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



1. когда temp возвращается из ф-ии он копируется, и удаляется. А так как у тебя не переопределен конструктор копирования вызывается конструктор копирования по умолчанию, вследствии чего у тебя копируется указатель, который удаляется при удалении Temp. В результате в объекте который получен из temp содержится кривой указатель, который никуда не указывает.
2. 
Код

class smth
{
     int a, b;
     ......
     smth& operator +=(const smth &rhs)
     {
          a += rhs.a;
          b += rhs.b;
          return *this;
     } 
     
     smth& operator +=(integral_type rhs)
     {
          a += rhs;
          b += rhs;
          return *this;
     } 
     ......
}

smth operator+(const smth &lhs, const smth &rhs)
{
    smth temp(lhs);
    return temp += rhs;
}


вот тебе пример, того, что я имел в виду

Добавлено @ 09:53
Код

 Matrix(Matrix& mx)
     {
         n = mx.n;
         m = mx.m;
       MX = new int*[n];
       for(int i = 0; i<n; i++)
             MX[i] = new int[m];
       for(int i = 0 ; i < n; i++)
           for(int j= 0 ; j < n; j++)
                MX[i][j] = mx.MX[i][j];
                 
     }

вот такой у тнебя должен быть контсруктор копирования.

Это сообщение отредактировал(а) vinter - 20.4.2008, 09:59


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


Новичок



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

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



Создал я такой конструктор копирования, написал operator+=(Matrix&), переписал соответствующим образом operator+(Matrix& rM), кстати, последний не может иметь более 1 аргументов, комп. ругается на operator+(Matrix& lM, Matrix& rM). Вот что в конечном образом получилось
Конструктор копирования
Код

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& Matrix::operator+= (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);
}

И наконец-то operator+
Код

Matrix Matrix::operator+ (Matrix& lM)
{
 Matrix temp(*this);
 return (temp += lM);
}

И вот что получается при вызове конструктора копирования в строке  Matrix temp(*this); передается *this уже пустой, т.е.

MX 0xcccccccc -> CXX0030: Error: expression cannot be evaluated
n  -858993460
m -858993460

Вот последнего я что-то не пойму: почему именно так происходит?! 

Я немного ошибся, в конструктор в строчке Matrix temp(*this); копируется всё нормально, но вот когда возвращается результат trmp+=lM, то перед этим вызывается деструктор, который удаляет temp, а в конечный результат уже копируется, судя по всему, удалённый temp, что влечёт вызов конструктора без параметров и получаем M3: MX(NULL), n(0), m(0). Хотя без перегруженного деструктора результат тот же.




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


Explorer
****


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

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



Цитата(student0511 @  20.4.2008,  13:22 Найти цитируемый пост)
кстати, последний не может иметь более 1 аргументов


Цитата(vinter @  20.4.2008,  01:58 Найти цитируемый пост)
пределить свободные ф-ии

Код

Matrix(const Matrix& mx)

Код

Matrix& Matrix::operator+= (const Matrix& M) 

Код

Matrix Matrix::operator+ (const Matrix& lM)

операцию покажи которую ты выполняешь.


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


Новичок



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

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



Не не пашет, переделал, а результат остался прежним.
Вот весь текст программы
Код

#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&);
     //////***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(&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+ (Matrix& M)
{
 Matrix temp(n, m);
 if(M.n == n && M.m == m)
  {
   for(int i = 0; i<n; i++)
      for(int j = 0; j<m; j++)
         *(*((temp.MX)+ i) + j) = *(*(MX + i) + j) + *(*((M.MX)+i)+j);
  }
  else
     cout<<"Wrong size!!!";
 
 return temp;
}*/
//////////////////////////////////////////
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;
}

Выражение сложение двух объектов: M3 = (M1 + M2); , соответственно.

Это сообщение отредактировал(а) student0511 - 20.4.2008, 14:48
PM MAIL   Вверх
Страницы: (4) Все 1 2 [3] 4 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0648 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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