Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
nocl1p
37 / 22 / 17
Регистрация: 30.03.2012
Сообщений: 300
#1

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

19.06.2014, 17:02. Просмотров 1120. Ответов 23
Метки нет (Все метки)

Вот есть такой класс

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;
};
Как для него перегрузить оператор присваивания?
http://www.cyberforum.ru/cpp-beginners/thread1096195.html
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.06.2014, 17:02
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Перегрузка оператора присваивания (C++):

Перегрузка оператора присваивания
struct pointer_command { public: void * x; public: void set(void * y){x...

Перегрузка оператора присваивания
При перегрузке оператора присвоения выдает ошибки cpp(58) : warning C4996:...

Перегрузка оператора присваивания
мне надо было реализовать конструкторы, деструктор, оператор присваивания,...

Перегрузка оператора присваивания
Доброго времени суток всем! Никак не могу правильно написать перегрузку...

Перегрузка оператора присваивания
Приветствую всех. Не могли бы подсказать как переопределить оператор...

23
nmcf
6237 / 5549 / 2524
Регистрация: 14.04.2014
Сообщений: 23,337
19.06.2014, 17:06 #2
C++
1
Matrix & operator = (const Matrix & m)
1
nocl1p
37 / 22 / 17
Регистрация: 30.03.2012
Сообщений: 300
19.06.2014, 17:08  [ТС] #3
Я имел ввиду что я не знаю как его реализовать.
0
nmcf
6237 / 5549 / 2524
Регистрация: 14.04.2014
Сообщений: 23,337
19.06.2014, 17:11 #4
Освобождаешь память, присваиваешь RowCount, ColCount из m, выделяешь по ним память, копируешь элементы.
1
nocl1p
37 / 22 / 17
Регистрация: 30.03.2012
Сообщений: 300
19.06.2014, 17:13  [ТС] #5
Хорошо. Щас буду пробовать. И еще одно почему метод Transpose() у меня не работает?((
0
nmcf
6237 / 5549 / 2524
Регистрация: 14.04.2014
Сообщений: 23,337
19.06.2014, 17:16 #6
А что он должен делать?
1
nocl1p
37 / 22 / 17
Регистрация: 30.03.2012
Сообщений: 300
19.06.2014, 17:17  [ТС] #7
Переставляет местами столбцы и строки в матрице.
0
nmcf
6237 / 5549 / 2524
Регистрация: 14.04.2014
Сообщений: 23,337
19.06.2014, 17:25 #8
Транспонирование? Его, наверное, не получится сделать просто переставляя элементы. Выделяй память под временный массив, копируй строки в столбцы и потом заменяй массив.
1
Kuzia domovenok
2208 / 1977 / 440
Регистрация: 25.03.2012
Сообщений: 6,930
Записей в блоге: 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;
}
}
вот это я и имел в виду. Для прямоугольных матриц это работать вообще не будет и выйдет за пределы массива,

а для квадратных, матрица будет транспонироваться дважды. т.к. после прохождения по элементам верхнего треугольника и замене их местами с нижним, цикл пройдёт ещё и по нижним элементам и переставит всё назад
1
nocl1p
37 / 22 / 17
Регистрация: 30.03.2012
Сообщений: 300
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];
            }
    }
А дальше че написать?
0
Kuzia domovenok
2208 / 1977 / 440
Регистрация: 25.03.2012
Сообщений: 6,930
Записей в блоге: 1
19.06.2014, 17:51 #11
nocl1p, нет, не так
1
nmcf
6237 / 5549 / 2524
Регистрация: 14.04.2014
Сообщений: 23,337
19.06.2014, 18:01 #12
Лучший ответ Сообщение было отмечено nocl1p как решение

Решение

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.
1
nocl1p
37 / 22 / 17
Регистрация: 30.03.2012
Сообщений: 300
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, то как ему что то присвоить?
0
Kuzia domovenok
2208 / 1977 / 440
Регистрация: 25.03.2012
Сообщений: 6,930
Записей в блоге: 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;
}
1
nocl1p
37 / 22 / 17
Регистрация: 30.03.2012
Сообщений: 300
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;
0
nmcf
6237 / 5549 / 2524
Регистрация: 14.04.2014
Сообщений: 23,337
19.06.2014, 18:19 #16
Ну ты даёшь, Array - указатель, ему не важно адрес какого массива хранить.
1
nocl1p
37 / 22 / 17
Регистрация: 30.03.2012
Сообщений: 300
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;
????? так
0
nmcf
6237 / 5549 / 2524
Регистрация: 14.04.2014
Сообщений: 23,337
19.06.2014, 18:48 #18
Новый так.
1
nocl1p
37 / 22 / 17
Регистрация: 30.03.2012
Сообщений: 300
19.06.2014, 18:51  [ТС] #19
но там ошибка происходит
Перегрузка оператора присваивания
0
nocl1p
37 / 22 / 17
Регистрация: 30.03.2012
Сообщений: 300
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, выделяешь по ним память, копируешь элементы.
Как выделить по ним память?
0
19.06.2014, 21:26
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.06.2014, 21:26
Привет! Вот еще темы с решениями:

Перегрузка оператора присваивания
Здравствуйте! Помогите, пожалуйста разобраться с перегрузкой оператора...

Перегрузка оператора присваивания
Добрый вечер ! Нужна помощь по небольшому теоретико-практическому вопросу....

Перегрузка оператора присваивания
Доброго времени суток! Возник вопрос по поводу перегрузки оператора...

Перегрузка оператора присваивания
Добрый вечер. Есть задание: Нужно так перегрузить оператор =, чтобы можно было...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru