Проблема, я думаю, является концептуальной.Ваш дизайн совершенно не объектно-ориентирован в том смысле, что дом не представляет собой объект, а скорее обеспечивает немного клея вокруг компонентов.С этой точки зрения было бы более разумно предоставлять средства доступа к элементам, а не сквозные функции:
class House {
Rectangle _base;
Triangle _roof;
public:
const Rectangle& base() const {
return _base;
}
const Triangle& roof() const {
return _roof;
}
};
Я полагаю, что это всего лишь игрушечный пример, но применимы те же соображения: классдолжен представлять объект, для которого предварительно сформирован набор операций, в некоторых случаях эти операции могут быть реализованы с точки зрения внутренних подобъектов, но они все еще являются операциями над типом, и способ их сбора является подробностью реализации.
Рассмотрим:
class House {
Thermostat t;
public:
int temperature() const {
return t.temperature();
}
};
С точки зрения пользователя, в доме есть температура, которая может быть считана, и в этой конкретной реализации она считывается с термостата, который является членом.Но это деталь реализации.Возможно, вы захотите позже установить больше термостатов в доме и заменить одно чтение средним значением, но это не изменит тот факт, что у объекта Дом (в этой модели) есть температура.
Товы должны думать не о реализации сквозных функций, а о реализации функций типа.Если реализация оказывается одной пересылкой во внутренний метод, это нормально.
Но если тип содержит внутренние элементы и имеет смысл обращаться к свойствам элементов, учтите, что, возможно, ваш тип должен просто предоставить доступ к его внутренним элементам.Предположим, что вы хотите переместить пианино в доме, тогда вы можете просто предоставить доступ к дверному проему и позволить пользователю проверить:
class House {
Door d;
public:
Door const & door() const {
return d;
}
};
bool can_enter_piano( House const & h, Piano const & p ) {
return h.door().width() > p.size();
}
Нет необходимости предоставлять House::get_door_width()
и House::get_door_color()
чтобы вы могли описать вход другу, и House::get_door_handle()
, чтобы они могли знать, когда они приедут ...