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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> operator, Проблема с операторами... 
V
    Опции темы
Arden
Дата 23.6.2009, 09:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 23.1.2009
Где: Украина, Волынь

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



Код

#include <cstdlib>
#include <iostream>

using namespace std;

class matrix{
      public:
             char name;
             int **A,x,y;
             matrix(char n, int a, int b);
             void fill();
             void print();
             void change(int a, int b);
             matrix& operator=(const matrix &other);
             matrix& operator+=(const matrix &other);
             const matrix operator+(const matrix &other);
      };

int main(int argc, char *argv[])
{
    matrix a('A',2,2);
    a.fill();
    cout<<endl;
    matrix b('B',2,2);
    b.fill();
    cout<<endl;
    a + b;
    a.print();
    cout<<endl;
    b.print();
    system("PAUSE");
    return EXIT_SUCCESS;
}

matrix::matrix(char n, int a, int b){ // конструктор
                    name = n; 
                    x = a;
                    y = b;
                    A = new int*[x];            // создает динамический двумерный массив
                    for(int i=0; i<x; i++){
                            A[i] = new int[y];
                            }
                    }
                    
void matrix::fill(){                                 // вбиваем массив вручную
     for(int i=0; i<x; i++){
             for(int j=0; j<y; j++){
                     cout<<name<<"["<<i+1<<"]["<<j+1<<"]=";
                     cin>>A[i][j];
                     }
             }
     }

void matrix::print(){                              // выводим массив на экран
     for(int i=0; i<x; i++){
             for(int j=0; j<y; j++){
                     cout<<A[i][j]<<" ";
                     }
             cout<<endl;
             }
     }
     
void matrix::change(int a, int b){          // метод удаляет массив, и создает новый размера а на b
     for(int i=0; i<x; i++){
             delete[] A[i];
             }
     delete[] A;
     x=a;
     y=b;
     A = new int*[x];
     for(int i=0; i<x; i++){
             A[i] = new int[y];
             }
     }

// дальше пошли дефиниции трёх операторов =, += и +, которые, собственно, 
// меня и интересуют

matrix& matrix::operator=(const matrix &other){
        if(x == other.x && y == other.y){
             for(int i=0; i<x; i++){
                     for(int j=0; j<y; j++){
                             A[i][j]=other.A[i][j];
                             }
                     }
             }
        else{
             change(other.x, other.y);
             for(int i=0; i<x; i++){
                     for(int j=0; j<y; j++){
                             A[i][j]=other.A[i][j];
                             }
                     }
             }
        }
        
matrix& matrix::operator+=(const matrix &other){
        for(int i=0; i<x; i++){
                for(int j=0; j<y; j++){
                        A[i][j]+=other.A[i][j];
                        }
                }
        return *this;
        }
        
const matrix matrix::operator+(const matrix &other){
      matrix result = *this;
      result += other;
      return result;
      }


Почему при использовании операции a + b, значение a изменяется? Ведь по сути оператор + у меня не меняет this, а лишь возвращает объект. Создается копия this, на этой копии используется описанный ранее оператор +=, и эта же копия возвращается в программу:
Код

const matrix matrix::operator+(const matrix &other){
      matrix result = *this;
      result += other;
      return result;
      }


Каким вообще боком тогда изменяется this?

Кстати, если сделать вот так:
Код

matrix a('A',2,2);
    a.fill();
    cout<<endl;
    matrix b('B',2,2);
    b.fill();
    cout<<endl;
    с = a + b;


то а при этом вообще получает рандомные значения. Просветите неуча, пожалуйста. Честно, очень старался сам найти ошибку... неосилил smile Спасибо заранее smile 

Это сообщение отредактировал(а) Arden - 23.6.2009, 09:49
PM MAIL   Вверх
zim22
Дата 23.6.2009, 09:54 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


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

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



объявите в классе operator+ как friend.
и копирующий конструктор определите.
тогда сможете написать так:

Код

matrix operator+(const matrix &lhs, const matrix &rhs) {
  matrix ret(lhs);
  ret += rhs;
  return ret;
}


Это сообщение отредактировал(а) zim22 - 23.6.2009, 09:55


--------------------
PM MAIL   Вверх
azesmcar
Дата 23.6.2009, 10:03 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

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



Arden
Цитата(Arden @  23.6.2009,  09:47 Найти цитируемый пост)
matrix result = *this;

Проблема в том, что тут вызывается не оператор присваивания а копирующий конструктор. Вы его не писали - следовательно компилятор сгенерирует его сам. (подробнее см. тут)
У вас там есть указательм, компилятор генерирует копирующий конструктор не зная об этом, следовательно он просто скопирует указатель и у вас будет два обьекта ссылающихся на одну и ту же область памяти.
Код

matrix::matrix(const matrix& r) :name(r.name), x(r.x), y.(r.y)
{
    A = new int*[x];            // создает динамический двумерный массив
    for(int i=0; i<x; i++){
        A[i] = new int[y];
        for (int j = 0; j < y; ++j)
            A[i][j] = r.A[i][j];
    }
}

добавьте вот это (вроде правильно, но стоит проверить, писал тут), должно полегчать smile

Это сообщение отредактировал(а) azesmcar - 23.6.2009, 10:04
PM   Вверх
Arden
Дата 2.7.2009, 01:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 23.1.2009
Где: Украина, Волынь

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



azesmcar, спасибо большое. 
Вопрос решен.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

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

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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