Форум программистов, компьютерный форум CyberForum.ru

Перегрузка оператора присваивания - C++

Восстановить пароль Регистрация
 
 
nocl1p
37 / 22 / 10
Регистрация: 30.03.2012
Сообщений: 299
19.06.2014, 17:02     Перегрузка оператора присваивания #1
Вот есть такой класс

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
template<typename TT>
class Matrix
{   
public:
//======================================================================================================
    Matrix<TT>(int Row, int Col)
    {
        RowCount = Row; ColCount = Col;
        Array = new TT *[RowCount];
        for (int index = 0; index < RowCount; index++)
            Array[index] = new TT [ColCount];
 
        int index1 = 0, index2 = 0;
        for(index1 = 0; index1 < RowCount; index1++)
            for(index2 = 0; index2 < ColCount; index2++)
                Array[index1][index2] = 0; 
    }
//======================================================================================================
    ~Matrix<TT>()
    {
        for(int index = 0; index < RowCount; index++)
            delete[] Array[index];
        delete[] Array;
        cout << "Destructor....";
        _getch();
    }
//======================================================================================================
    TT operator ()(int IND1, int IND2)
    {
        if(IND1 < 0 || IND2 < 0 || IND1 > (RowCount - 1) || IND2 > (ColCount - 1))
        {
            cout << "Неверный индекс!!!";
            return -1;
        }
        return Array[IND1][IND2];
    }
//======================================================================================================
    
//======================================================================================================
    void Transpose()
    {
        for (int IND1 = 0; IND1 < RowCount; IND1++)
            for (int IND2 = 0; IND2 < ColCount; IND2++)
            {
                TT temp = Array[IND1][IND2];
                Array[IND1][IND2] = Array[IND2][IND1];
                Array[IND2][IND1] = temp;
            }
    }
//======================================================================================================
private:
    int RowCount, ColCount;
    TT **Array;
};
Как для него перегрузить оператор присваивания?
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
nmcf
4318 / 3739 / 1260
Регистрация: 14.04.2014
Сообщений: 14,664
19.06.2014, 17:06     Перегрузка оператора присваивания #2
C++
1
Matrix & operator = (const Matrix & m)
nocl1p
37 / 22 / 10
Регистрация: 30.03.2012
Сообщений: 299
19.06.2014, 17:08  [ТС]     Перегрузка оператора присваивания #3
Я имел ввиду что я не знаю как его реализовать.
nmcf
4318 / 3739 / 1260
Регистрация: 14.04.2014
Сообщений: 14,664
19.06.2014, 17:11     Перегрузка оператора присваивания #4
Освобождаешь память, присваиваешь RowCount, ColCount из m, выделяешь по ним память, копируешь элементы.
nocl1p
37 / 22 / 10
Регистрация: 30.03.2012
Сообщений: 299
19.06.2014, 17:13  [ТС]     Перегрузка оператора присваивания #5
Хорошо. Щас буду пробовать. И еще одно почему метод Transpose() у меня не работает?((
nmcf
4318 / 3739 / 1260
Регистрация: 14.04.2014
Сообщений: 14,664
19.06.2014, 17:16     Перегрузка оператора присваивания #6
А что он должен делать?
nocl1p
37 / 22 / 10
Регистрация: 30.03.2012
Сообщений: 299
19.06.2014, 17:17  [ТС]     Перегрузка оператора присваивания #7
Переставляет местами столбцы и строки в матрице.
nmcf
4318 / 3739 / 1260
Регистрация: 14.04.2014
Сообщений: 14,664
19.06.2014, 17:25     Перегрузка оператора присваивания #8
Транспонирование? Его, наверное, не получится сделать просто переставляя элементы. Выделяй память под временный массив, копируй строки в столбцы и потом заменяй массив.
Kuzia domovenok
 Аватар для Kuzia domovenok
1883 / 1738 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
19.06.2014, 17:37     Перегрузка оператора присваивания #9
nmcf, вообще-то можно для квадратной матрицы пройтись по каждому элементу верхнего треугольника и поменять местами с симметричным ему.
А в общем случае да, нужен второй массив.

Добавлено через 3 минуты
Цитата Сообщение от nocl1p Посмотреть сообщение
void Transpose() {
for (int IND1 = 0; IND1 < RowCount; IND1++)
for (int IND2 = 0; IND2 < ColCount; IND2++) {
TT temp = Array[IND1][IND2];
Array[IND1][IND2] = Array[IND2][IND1];
Array[IND2][IND1] = temp;
}
}
вот это я и имел в виду. Для прямоугольных матриц это работать вообще не будет и выйдет за пределы массива,

а для квадратных, матрица будет транспонироваться дважды. т.к. после прохождения по элементам верхнего треугольника и замене их местами с нижним, цикл пройдёт ещё и по нижним элементам и переставит всё назад
nocl1p
37 / 22 / 10
Регистрация: 30.03.2012
Сообщений: 299
19.06.2014, 17:37  [ТС]     Перегрузка оператора присваивания #10
Вот так?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void Transpose()
    {
        for (int IND1 = 0; IND1 < RowCount; IND1++)
            for (int IND2 = 0; IND2 < ColCount; IND2++)
            {
//              TT temp = Array[IND1][IND2];
//              Array[IND1][IND2] = Array[IND2][IND1];
//              Array[IND2][IND1] = temp;
 
                TT **Arr;
                Arr = new TT *[RowCount]
                for (int I = 0; I < RowCount; I++)
                    Arr[I] = new TT[ColCount];
 
                for (int i = 0; i < RowCount; i++)
                    for (int j = 0; j < ColCount; j++)
                        Arr[i][j] = Array[IND2][IND1];
            }
    }
А дальше че написать?
Kuzia domovenok
 Аватар для Kuzia domovenok
1883 / 1738 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
19.06.2014, 17:51     Перегрузка оператора присваивания #11
nocl1p, нет, не так
nmcf
4318 / 3739 / 1260
Регистрация: 14.04.2014
Сообщений: 14,664
19.06.2014, 18:01     Перегрузка оператора присваивания #12
Сообщение было отмечено автором темы, экспертом или модератором как ответ
C++
1
2
3
4
5
TT **Arr = new TT *[ColCount];
for (int i = 0; i < ColCount; i++) Arr[i] = new TT[RowCount];
for (int i = 0; i < RowCount; i++)
    for (int j = 0; j < ColCount; j++)
        Arr[j][i] = Array[i][j];
Затем осовбодить память Array, и присвоить Arr; обменять значения RowCount и ColCount.
nocl1p
37 / 22 / 10
Регистрация: 30.03.2012
Сообщений: 299
19.06.2014, 18:15  [ТС]     Перегрузка оператора присваивания #13
C++
1
2
3
4
5
6
7
for(int index = 0; index < RowCount; index++)
            delete[] Array[index];
        delete[] Array;
 
        for (int i = 0; i < RowCount; i++)
            for (int j = 0; j < ColCount; j++)
                Array[i][j] = Arr[j][i];
?????????

Добавлено через 56 секунд
Если освободить память Array, то как ему что то присвоить?
Kuzia domovenok
 Аватар для Kuzia domovenok
1883 / 1738 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
19.06.2014, 18:15     Перегрузка оператора присваивания #14
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void Transpose()
{
    int newRowCount=ColCount, newColCount=RowCount;
    TT **tmpArr;
    tmpArr = new TT *[newRowCount];
        for (int IND1 = 0; IND1 < newRowCount; ++IND1){
            tmpArr[IND1] = new TT [newColCount];
            for (int IND2 = 0; IND2 < newColCount; ++IND2)
            {
                        tmpArr[IND1][IND2]=Array[IND2][IND1];
            }
        }
    for (int IND1 = 0; IND1 < RowCount; ++IND1){
        delete[] Array[IND1];
    }
    delete[] Array;
    Array=tmpArr;
    ColCount=newColCount;
    RowCount=newRowCount;
}
nocl1p
37 / 22 / 10
Регистрация: 30.03.2012
Сообщений: 299
19.06.2014, 18:19  [ТС]     Перегрузка оператора присваивания #15
Я понял))))))))))))
C++
1
2
3
4
5
6
7
8
for(int index = 0; index < RowCount; index++)
            delete[] Array[index];
        delete[] Array;
 
//      for (int i = 0; i < RowCount; i++)
//          for (int j = 0; j < ColCount; j++)
//              Array[i][j] = Arr[j][i];
        Array = Arr;
nmcf
4318 / 3739 / 1260
Регистрация: 14.04.2014
Сообщений: 14,664
19.06.2014, 18:19     Перегрузка оператора присваивания #16
Ну ты даёшь, Array - указатель, ему не важно адрес какого массива хранить.
nocl1p
37 / 22 / 10
Регистрация: 30.03.2012
Сообщений: 299
19.06.2014, 18:45  [ТС]     Перегрузка оператора присваивания #17
У меня бывает так. Клинит иногда.

Добавлено через 17 минут
А как сделать чтобы функция Transpose() возвратила объект типа Matrix?

Добавлено через 7 минут
C++
1
2
3
4
5
6
Matrix<TT> Transpose()
...........................................
 
Matrix<TT> matr(ColCount, RowCount);
 
        return matr;
????? так
nmcf
4318 / 3739 / 1260
Регистрация: 14.04.2014
Сообщений: 14,664
19.06.2014, 18:48     Перегрузка оператора присваивания #18
Новый так.
nocl1p
37 / 22 / 10
Регистрация: 30.03.2012
Сообщений: 299
19.06.2014, 18:51  [ТС]     Перегрузка оператора присваивания #19
но там ошибка происходит
Перегрузка оператора присваивания
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.06.2014, 21:26     Перегрузка оператора присваивания
Еще ссылки по теме:

Перегрузка оператора присваивания C++
Конструктор копирования и перегрузка оператора присваивания C++
C++ Перегрузка оператора присваивания = (найти ошибку в коде)

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
nocl1p
37 / 22 / 10
Регистрация: 30.03.2012
Сообщений: 299
19.06.2014, 21:26  [ТС]     Перегрузка оператора присваивания #20
что не правильно? запускаю и ошибка вылетает как на предидущей картинке

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
template<typename TT>
class Matrix
{   
public:
//======================================================================================================
    Matrix<TT>(int Row, int Col)
    {
        RowCount = Row; ColCount = Col;
        Array = new TT *[RowCount];
        for (int index = 0; index < RowCount; index++)
            Array[index] = new TT [ColCount];
 
        int index1 = 0, index2 = 0;
        for(index1 = 0; index1 < RowCount; index1++)
            //for(index2 = 0; index2 < ColCount; index2++)
        {Array[index1][0] = 1; Array[index1][1] = 2; Array[index1][2] = 3; Array[index1][3] = 4;} 
    }
//======================================================================================================
    ~Matrix<TT>()
    {
        for(int index = 0; index < RowCount; index++)
            delete[] Array[index];
        delete[] Array;
        cout << "Destructor....";
        _getch();
    }
//======================================================================================================
    TT operator ()(int IND1, int IND2)
    {
        return Array[IND1][IND2];
    }
//======================================================================================================
    void SetIdenty()
    {
        if (RowCount == ColCount)
        {
            // Обнуляем все элементы массива
            int IND1, IND2;
            for (IND1 = 0; IND1 < RowCount; IND1++)
                for (IND2 = 0; IND2 < RowCount; IND2++)
                {
                    Array[IND1][IND2] = 0;
                    Array[IND1][IND1] = 1;
                }
        }
    }
//======================================================================================================
    void Transpose()
    {
        int newRowCount = ColCount, newColCount = RowCount;
        // Создаем вспомогательный массив
        TT **Arr = new TT *[newColCount];
        for (int i = 0; i < newColCount; i++)
            Arr[i] = new TT[newRowCount];
        // Присваиваем строки массива Array столбцам массива Arr
        for (int i = 0; i < RowCount; i++)
            for (int j = 0; j < ColCount; j++)
                Arr[j][i] = Array[i][j];
        // Освобождаем память Array
        for(int index = 0; index < RowCount; index++)
            delete[] Array[index];
        delete[] Array;
        // Присваиваем Arr
        Array = Arr;
        ColCount = newColCount;
        RowCount = newRowCount;
    }
//======================================================================================================
private:
    int RowCount, ColCount;
    TT **Array;
};
Добавлено через 1 час 29 минут
Цитата Сообщение от nmcf Посмотреть сообщение
Освобождаешь память, присваиваешь RowCount, ColCount из m, выделяешь по ним память, копируешь элементы.
Как выделить по ним память?
Yandex
Объявления
19.06.2014, 21:26     Перегрузка оператора присваивания
Ответ Создать тему
Опции темы

Текущее время: 16:27. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru