Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > перезагрузка =


Автор: MFSham 14.2.2006, 04:17
Возникла такая проблема: пытаюсь в классе перезагрузить оператор присваивания при работе с двумя матрицами(одинакового размера), но чего-то не получается. Вот что у меня имеется(консоль) :
Код

//---------------------------------------------------------------------------
#include <vcl.h>
#include <iostream>
#include <conio>

using namespace std;
//---------------------------------------------------------------------------

class Matrix
{
public:
    Matrix(int count);
    ~Matrix();
    void Show();
    int GetLenght();
    Matrix operator = (Matrix mas);
private:
    double **point;
    int lenght;
};

Matrix::Matrix(int count)
{
    lenght=count;
    point = new double*[count];
      for (int i=0; i<count; i++)
        point[i] = new double[count];

    for (int i=0; i<count; i++)
      for (int j=0; j<count; j++)
        point[i][j]=random(10);
}

Matrix::~Matrix()
{
    delete[] point;
}

void Matrix::Show()
{
    for (int i=0; i<lenght; i++)
       {
          for (int j=0; j<lenght; j++)                                         //  после перезагрузки 
             cout << point[i][j] << " ";                                       //   возникает ошибка
          cout <<"          "<< point[i] << '\n';
       }
    cout << point << '\n';
}

int Matrix::GetLenght()
{
    return lenght;
}

Matrix Matrix::operator = (Matrix mas)
{
    for (int i=0; i<lenght; i++)
    {
        for (int j=0; j<lenght; j++)
          point[i][j]=mas.point[i][j];
    }

    return *this;
}

int main()
{
      randomize();
      Matrix mas(10), mas2(10);

      mas.Show();
      cout <<  "------------------\n";
      mas2.Show();
      mas=mas2;
      cout <<  "------------------\n";
      mas.Show();
      cout <<  "------------------\n";
      mas2.Show();
      getch();
        return 0;
}
//---------------------------------------------------------------------------


При попытке выявить ошибку заметил, что после перезагрузки у двух(что мне вообще непонятно, т.к. присваивание то в одну сторону) массивов на 0,1 и последнем местах в переменной point[i] находятся "левые" адреса, а на остальных все как и должно быть.

Автор: BreakPointMAN 14.2.2006, 07:33
"Перезагрузка" это в "Матрице", а в C++ - "перегрузка"! Это раз!

Прототип функции-оператора присваивания у тебя должен выглядеть так:
Код

Matrix& operator = (const Matrix& mas);

Это два.

Да и само тело этой оператор-функции у тебя некорректно, но, сорри, не успею ответить, ибо пора уходить...


Автор: chaos 14.2.2006, 08:24
обрати внимание на выделение памяти и ее освобождение - там у тебя косяки

Автор: MAKCim 14.2.2006, 08:27
не помешало бы еще зделать копирующий конструктор
Код

Matrix::Matrix(const Matrix&);

в деструкторе нужно сначала удалить строки затем массив из указателей
Код

for (int i=0; i<length; i++) delete []point[i];
delete []point;

для выывода вместо Show() можно перегрузить operator<<
Код

ostream& operator<<(ostream& stream, const Matrix& object)
{
    //запись в stream
}

Автор: MFSham 17.2.2006, 01:40
Цитата(BreakPointMAN @ 14.2.2006, 07:33 Найти цитируемый пост)
"Перезагрузка" это в "Матрице", а в C++ - "перегрузка"! Это раз!

Извиняюсь, неправильно написал.
Цитата(BreakPointMAN @ 14.2.2006, 07:33 Найти цитируемый пост)

Прототип функции-оператора присваивания у тебя должен выглядеть так:
Matrix& operator = (const Matrix& mas);

Спасибо, вроде начало работать.

Цитата(BreakPointMAN @ 14.2.2006, 07:33 Найти цитируемый пост)
Да и само тело этой оператор-функции у тебя некорректно

А можно немного поконкретнее что именно?

Извиняюсь за настырность(очень хочется разобраться), но как в данном примере будет выглядеть оператор перегрузки "+". Вот что у меня получилось:
Код

{
              ...........................        
    Matrix &operator = (const Matrix &mas);
    Matrix operator + (const Matrix &mas);
              ...........................
Matrix &Matrix::operator = (const Matrix &mas)
{
    for (int i=0; i<length; i++)
    {
        for (int j=0; j<length; j++)
          point[i]=mas.point[i];
    }
    return *this;
}

Matrix Matrix::operator + (const Matrix &mas)
    Matrix mas3(10);
    for (int i=0; i<length; i++)
    {
        for (int j=0; j<length; j++)
           mas3.point[i][j]=point[i][j]+mas.point[i][j];
    }
    return mas3;
}

Автор: BreakPointMAN 17.2.2006, 02:21
Код

Matrix &Matrix::operator = (const Matrix &mas)
{
    for (int i=0; i<length; i++)
    {
        for (int j=0; j<length; j++)
          point[i]=mas.point[i]; //  что это за жуть?!
    }
    return *this;
}

Автор: MFSham 17.2.2006, 15:17
Упс:
Код

Matrix &Matrix::operator = (const Matrix &mas)
{
    for (int i=0; i<length; i++)
    {
        for (int j=0; j<length; j++)
          point[i][j]=mas.point[i][j]; 
    }
    return *this;
}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)