В чем проблема?
Сообщение об ошибке другого компилятора может пролить свет на проблему:
ошибка: преобразование из «квадрата» в нескалярный тип «UpdateStatusSquare»'запрашивается
Вы определили operator*()
вашего BoardIterator
для возврата ссылки на Square
, а не UpdateStatusSquare
.И на самом деле это работает очень хорошо, если использовать его по назначению:
BoardIterator iter;
Square& x = *iter; // no compiler issue ! I could use x later on
Ваше первоначальное назначение вызывает проблему, поскольку компилятор не знает, как преобразовать Square
в UpdateStatusSquare
.Как мог компилятор сделать это, если возвращаемый вами квадрат будет CareerSquaere
?
Как ее решить?
Вы должны обращаться с абстрактными полиморфными классами с осторожностью.Во-первых, если вы делаете присваивание значения, как вы пытались, вы можете slice возвращаемый объект.Так что лучше всего использовать ссылки, указатели (или, лучше, умные указатели).
Теперь преобразование Square
(не зная, какой именно это тип квадрата) в UpdateStatusSquare
называется downcasting .Вы можете сделать это, но с особой осторожностью, используя dynamic_cast
:
UpdateStatusSquare *it = dynamic_cast<UpdateStatusSquare*>(&*iter);
if (it) {
// conversion worked the iterator pointed to a compatible type
}
else {
// it==nullptr because iterator pointed to an incompatible kind of square
}
Демо