Во-первых; в следующем фрагменте кода this
индексируется с помощью '.', но this
является указателем, поэтому вы должны использовать val = val_new;
(неявно this->val = val_new;
):
void copy() {
this.val = val_new;
}
... должно быть ...
void copy() {
val = val_new;
// or this->val = val_new;
}
Та же проблема на Rectangle::load
.
Во-вторых: как говорят другие, вы должны использовать T val, val_new
вместо int val, val_new
.
И последнее, но не менее важное:
Rectangle(TwoPoint i) {
val = new Shape<TwoPoint> (i);
}
val
следует инициализировать так:
Rectangle(TwoPoint i)
: val(Shape<TwoPoint> (i)) { }
Для этого есть две причины:
- Если
val
не инициализируется подобным образом, используется конструктор по умолчанию (Shape<T>::Shape()
), которого не существует.
- Ключевое слово
new
выделяет новую память в C ++ и возвращает указатель. Его следует оставить, поскольку val
- не указатель, а значение.
В конструкторах вы можете инициализировать значения элементов, вызывая их конструкторы или вызывая их с их значением (конструктор автоматически генерируемых копий). К этому следует добавить префикс двоеточия, за которым следует тело функции.