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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблемы при перегрузке + 
V
    Опции темы
Podarochek
Дата 14.5.2008, 13:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



При удаленироги первого объекта (т.е. выходе из области действия) прога вылетает smile

Добавлено через 23 секунды
Код

#include <iostream>
using namespace std;
class Matrix{
    int Rows; 
    int Cols;
public:
    Matrix(int Row=1,int Col=1);
    ~Matrix(void);
    float ** FloatData;
    void Display();
    void Fill();
    Matrix operator+ (Matrix);
};
Matrix::Matrix(int Row,int Col){
    Rows = Row;
    Cols = Col;
    FloatData= new float * [Rows];
    for (int j=0;j<Rows;j++){
        FloatData[j] = new float[Cols];
        for (int i=0;i<Cols;i++){
            FloatData[j][i]=0.0;
        }
    }
    return;
};
Matrix::~Matrix()
{
    for (int j=0;j<Rows;j++){
        cout<<"delete"<<j<<endl;
        delete[] FloatData[j];
    }
delete [] FloatData;
};
void Matrix::Fill()
{
    for (int j=0;j<Rows;j++){
        for (int i=0;i<Cols;i++){
            FloatData[j][i]=(float)rand();
        }
    }
    return;
}
void Matrix::Display()
{
    printf("\n Matrix \n");
    for (int j=0;j<Rows;j++){
        printf("Row:%i>", j);        // нумеруем каждый ряд
        for (int i=0;i<Cols;i++){
            printf("%5.0f ",FloatData[i][j]); // печатаем колонки
        }
    }
    return;
}
Matrix Matrix::operator + (Matrix A){
        
        for (int j=0;j<Rows;j++){

            for (int i=0;i<Cols;i++){

                FloatData[j][i]=FloatData[j][i]+A.FloatData[j][i];
            
            }
        }
return *this;
}
void main()
{
    int Row,Col;
    cout << "\nRow ?:" ;
    cin >> Row ;
    cout << "\nCol ?:" ;
    cin >> Col ;
    Matrix Matrix0(Row,Col);    // создадим нашу матрицу
    Matrix Matrix1(Row,Col);
    Matrix0.Fill();   
    Matrix1.Fill();
    Matrix0.Display();   
    Matrix1.Display();
    Matrix0+Matrix1;
    Matrix0.Display();
}

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


Explorer
****


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

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



Код

Matrix& Matrix::operator + (const Matrix& A){

а вообще все неправильно, надо делать конструктор копирования. Да и где ты видел чтобы оператор + менял значения аргументов?

Это сообщение отредактировал(а) vinter - 14.5.2008, 14:01


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


Шустрый
*


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

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



Цитата(vinter @  14.5.2008,  14:00 Найти цитируемый пост)
а вообще все неправильно, надо делать конструктор копирования. Да и где ты видел чтобы оператор + менял значения аргументов?

Полностью согласен! но мне показалы данный пример, хотелось разобраться. Как учебный вариант...
PM MAIL   Вверх
just_geek
Дата 14.5.2008, 14:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Не правильно operator+ написан. Во-первых, аргумент передавай по ссылке. Во-вторых, возвращатся должен новый объект, а не *this.
PM MAIL   Вверх
Podarochek
Дата 14.5.2008, 14:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(just_geek @  14.5.2008,  14:07 Найти цитируемый пост)
Во-вторых, возвращатся должен новый объект, а не *this. 


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

Добавлено через 4 минуты
Matrix& Matrix::operator + (const Matrix& A){
        
        for (int j=0;j<Rows;j++){

            for (int i=0;i<Cols;i++){

                FloatData[j][i]=FloatData[j][i]+A.FloatData[j][i];
            
            }
        }
return *this;
}

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


Explorer
****


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

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



в твоем случае ошибка именно из-за того что нет конструктора копирования.


--------------------
Мой блог
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.0811 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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