Opened 3 years ago
Closed 3 years ago
#459 closed ожидается проверка (задача сдана)
WW #9 (Ushakov)
Reported by: | ushakov.vladislav | Owned by: | Святослав Власов |
---|---|---|---|
Component: | WW figures | Version: | 3.0 |
Keywords: | Cc: |
Description
Change History (6)
comment:1 Changed 3 years ago by
Type: | ожидается проверка → ожидаются исправления |
---|
comment:2 Changed 3 years ago by
Type: | ожидаются исправления → ожидается проверка |
---|---|
Version: | 1.0 → 2.0 |
Смог найти только проблему с выделением памяти под label. Надо было на 1 больше выделять. В остальном все вроде работает.
comment:3 Changed 3 years ago by
И вот еще какой вопрос:
Допустим, я хочу сделать конструктор копирования для класса Scheme. Причем копировать хочется схему вместе с объектами, не зная при этом, указатели на что хранятся в figures_.
Т.е. примерно как-то так:
Scheme::Scheme(const Scheme &other) : cp_(other.cp_), sz_(other.sz_), figures_(new Figure *[cp_]) { for (int i = 0; i < sz_; ++i) { figures_[i] = new Figure(*(other.figures_[i])); } }
Вот только конструкторы нельзя объявлять виртуальными, а значит не получится вызвать конструктор правильного наследника... или получится?
Есть ли в языке возможность это сделать?
comment:4 Changed 3 years ago by
Type: | ожидается проверка → ожидаются исправления |
---|
Ловишь сегфолт на вот таком примере:
Scheme scheme(100); scheme.push_back_figure(new Rectangle(28, 1, 1, 2, 2)); scheme.push_back_figure(new Rectangle(234, -1, 1, 2, 2)); scheme.push_back_figure(new Rectangle(233, -1, 1, 2, 2)); scheme.remove_figure(234); scheme.remove_figure(28); scheme.print_all_figures();
Ты неправильно осуществляешь сдвиг в функции remove_figure
. Ты зачем-то вычисляешь смещение между адресами двух фигур. Они в памяти могут располагаться совершенно где угодно.
Пока что 5/10
Допустим, я хочу сделать конструктор копирования для класса Scheme. Причем копировать хочется схему вместе с объектами, не зная при этом, указатели на что хранятся в figures_.
Конструктор нельзя сделать виртуальным, но можно сделать виртуальный фабричный метод Figure* Figure::clone() = 0;
, который будет копировать объект и возвращать указатель на скопированный объект, и переопределить его в Circle
и Rectangle
. Таким образом конструктор копирования для Scheme
может у тебя выглядеть примерно так:
Scheme::Scheme(const Scheme& oth) { cp_ = oth.cp_; sz_ = oth.sz_; figures_ = new Figures*[cp_]; for (int i = 0; i < sz_; ++i) { figures_[i] = oth.figures_[i]->clone(); } }
comment:5 Changed 3 years ago by
Type: | ожидаются исправления → ожидается проверка |
---|---|
Version: | 2.0 → 3.0 |
Починил remove_figure
.
comment:6 Changed 3 years ago by
Resolution: | → задача сдана |
---|---|
Status: | assigned → closed |
Теперь всё хорошо, 10/10
Все тесты попадали -- одни с сегфолтом, другие по ошибкам валгринда.
По стилю пока замечаний нет, нужно исправить корректность.