Я предполагаю, что это классика, но в моем случае у меня есть ограничения, которые должны упростить проблему.C++: Расширить объект путем downcasting до производного класса
Просто я получаю некоторую структуру А на входе моего модуля и хочу добавить к нему несколько атрибутов. Поэтому я создаю структуру B, которая расширяет A и добавляет то, что мне нужно.
Теперь, когда я вызываю метод, ожидающий B, но я его подаю, компилятор не доволен: объекты не могут быть Bs, как и все кошки - не львы.
Но в моем случае я клянусь, что все как Bs, хотя и с меньшими атрибутами. Атрибуты, которые не найдены, могут быть представлены как неинициализированные, это прекрасно, я также клянусь, что никогда не буду вызывать атрибут перед его инициализацией. В основном, первое, что я делаю, когда вы получаете объекты A в качестве входных данных, это заполнить оставшиеся атрибуты B, которые вычисляются на основе атрибутов A. Я просто не хочу делать копии «Как я попадаю в Bs» только для добавления нескольких атрибутов, потому что тогда атрибуты As будут скопированы в память. Я не собираюсь когда-либо модифицировать эти исходные атрибуты A либо, я просто собираюсь использовать их для вычисления производных атрибутов, а затем переходить и работать с объектами B с атрибутами A и производными атрибутами.
Пример:
От общего, проекта шириной заголовка:
struct Rectangle {
// Side lengths
int a,b;
}
Из локального заголовка:
struct LocalRectangle : Rectangle {
int area;
}
void updateModule(Rectangle inputRect);
От местного источника:
void updateModule(Rectangle inputRect) {
LocalRectangle r = (LocalRectangle)inputRect;
r.area = r.a*r.b;
// More processing ...
}
Как я сделай это ?
Спасибо заранее,
Чарльз
Не могли бы вы отправить код? –
Возможно, вы могли бы добавить поле к структуре As типа 'std :: map', которое будет содержать разные атрибуты и удалить структуры Bs, будучи все типа A. – LoPiTaL
Можете ли вы изменить' A'? – Motti