Здравствуйте, Vulko, Вы писали:
V>Заранее прошу не тереть модеров тему. Хоть и я пишу всё на C++, но в данном случае разницы нету никакой. На дельфи всё почти также.
V>Есть класс динамической матрицы. Пишу перегрузку оператора =, чтобы можно было легко присваивать матрицы.
V>В итоге присвоения не происходит. Хоть убей, не пойму что не так в алгоритме присваивания...
1. if (i == k && j == l)
2. а где else?
Re: Не соображу что не так при перегрузке оператора =...
Здравствуйте, jazzer, Вы писали:
J>Здравствуйте, Кирпа В.А., Вы писали:
КВА>>Со своей колокольни позволю добавить что оператор присвоения должен иметь КВА>>немного другую сигнатуру
J>разве что с колокольни, потому что по стандарту — не должен (как и конструктор копирования, кстати)
Согласен что не должен но const в операторе присвоения это правило хорошего тона ИМХО
(как никак дополнительно развязывает руки оптимизатору компилятора)
Да и согласись что если в операции копмрования изменяется объект то это не совсем gut
Так хоть компилятор на такие действия рявкнет при банальной описке а иначе ищи трудно уловимый баг
!0xDEAD
Re[4]: Не соображу что не так при перегрузке оператора =...
Здравствуйте, Кирпа В.А., Вы писали:
КВА>Согласен что не должен но const в операторе присвоения это правило хорошего тона ИМХО КВА>(как никак дополнительно развязывает руки оптимизатору компилятора) КВА>Да и согласись что если в операции копмрования изменяется объект то это не совсем gut КВА>Так хоть компилятор на такие действия рявкнет при банальной описке а иначе ищи трудно уловимый баг
в большинстве случаев — да, хотя есть и обратные примеры, например, std::auto_ptr
V>// присваивание
V> Array2D &Array2D::operator=(Array2D &arr)
V> {
V> int i, j, k, l;
V> this -> GetSize(i, j);
V> arr.GetSize(k, l);
V> if (i != k)
V> if (j != l)
V> for (i = 0; i < k; i++)
V> for (j = 0; j < l; j++)
V> this -> push( i, j, arr.pop(i, j) );
V> return *this;
V> }
V>
Что мне не понравилось в Вашем операторе присваивания:
1) Размеры двух массивов могут не совпадать, в этом случае, у this нужно удалить base и выделить память заново под новый размер, а также изменить значения columnSize и rowSize
2) Копировать содержимое объекта arr в текущий массив нужно всегда, а не только когда размеры массивов не совпадали.
Теперь ответ на Ваш вопрос "почему оператор не работает". Он работает, только если хотябы один размер массивов совпадает, то он ничего не делает (см. пункт 2). Если размеры не совпадают, то делает, но неправильно (может выходить за рамки выделенной памяти, см. пункт 1).
Re[5]: Не соображу что не так при перегрузке оператора =...
Здравствуйте, jazzer, Вы писали:
J>Здравствуйте, Кирпа В.А., Вы писали:
КВА>>Согласен что не должен но const в операторе присвоения это правило хорошего тона ИМХО КВА>>(как никак дополнительно развязывает руки оптимизатору компилятора) КВА>>Да и согласись что если в операции копмрования изменяется объект то это не совсем gut КВА>>Так хоть компилятор на такие действия рявкнет при банальной описке а иначе ищи трудно уловимый баг
J>в большинстве случаев — да, хотя есть и обратные примеры, например, std::auto_ptr
Ну std::auto_ptr это отдельная песня
то что они открыли оператор присвоения и конструктор копирования сами себе навредили
тем самым получив проблемы хранения их в контейнерах
Здравствуйте, Кирпа В.А., Вы писали:
J>>в большинстве случаев — да, хотя есть и обратные примеры, например, std::auto_ptr
КВА>Ну std::auto_ptr это отдельная песня КВА>то что они открыли оператор присвоения и конструктор копирования сами себе навредили КВА>тем самым получив проблемы хранения их в контейнерах
КВА>Вот BOOST уже таких глупостей избежал
будет с моей стороны большой наглостью сказать, что boost::scoped_ptr и std::auto_ptr решают разные задачи?