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 ushakov.vladislav

Type: ожидаются исправленияожидается проверка
Version: 1.02.0

Смог найти только проблему с выделением памяти под label. Надо было на 1 больше выделять. В остальном все вроде работает.

comment:3 Changed 3 years ago by ushakov.vladislav

И вот еще какой вопрос:
Допустим, я хочу сделать конструктор копирования для класса 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 ushakov.vladislav

Type: ожидаются исправленияожидается проверка
Version: 2.03.0

Починил remove_figure.

comment:6 Changed 3 years ago by Святослав Власов

Resolution: задача сдана
Status: assignedclosed

Теперь всё хорошо, 10/10

Note: See TracTickets for help on using tickets.