С++ Composition - должен ли я обернуть все эти функции?

У меня есть класс С++, который описывает ориентацию объекта в 3D-пространстве - местоположение, поворот, масштаб и т.д. У меня есть другие классы, которые обязательно нуждаются в такой информации (или ее подмножестве) - модели, ландшафты, камеры и т.д. Теперь я мог бы сделать эти подклассы моего класса ориентации, но Гугль сказал мне, чтобы я предпочитал композицию над наследованием. Это философски имеет смысл - модель не является ориентировкой, она имеет один (и да, я знаю, что есть -это вещь - это просто эвристика). Тем не менее кажется бесполезным, почти комично неэлегантным переписывать те же методы обертки для всех этих потенциальных подклассов, которые просто идут на эту функциональность. Такие вещи, как model.getOrientation().set_x(1), кажутся глупыми.

Я могу понять, почему это не было бы "слишком плохо" для небольших объектов, но для этого примера (и тому подобное), , что точка композиции, если вам нужно пройти через обручи, чтобы притворяться, что вы используете наследование? Должен ли я использовать его сейчас? Я почти уверен, что думаю об этом ненадлежащим образом.

Ответ 1

Это может показаться глупым, но ваш model.getOrientation().set_x(1) - это, вероятно, путь.

Если вам надоело печатать часть getOrientation(), вы можете попробовать что-то вроде этого:

Orientation & orient = model.getOrientation();
orient.set_x(1);
orient.set_y(1);
if( orient.check_something() ) {
  //whatever
}
//etc.

Ответ 2

Там дешевый способ избежать большей части шаблона упаковки.

class model : private orientation {
  public:
    using orientation::set_x;
    ... etc ...
};

Частное наследование в С++ не означает (обязательно) "означает". Это более или менее невидимое для посторонних, и иногда описывается как значение "реализуется с точки зрения". То есть вы получаете ограниченную форму композиции, которая помогает вам раскрывать часть или весь интерфейс скомпонованного объекта.

Ответ 3

Напишите класс для вещей, имеющих ориентацию. Пусть модели, ландшафты, камеры и т.д. Наследуются от этого класса. Если вы хотите сделать какую-либо упаковку, вам нужно сделать это только в одном классе. Использование геттеров выполняется так, что вы можете изменить способ сохранения ориентации объекта.