C++组合 - 我必须包装所有这些函数吗?

Gra*_*her 10 c++ oop inheritance composition

我有一个C++类来描述3D空间中对象的方向 - 位置,旋转,缩放等.我有其他类需要这样的信息(或其中的一部分) - 模型,地形,相机等.现在我可以创建我的方向类的子类,但谷歌告诉我更喜欢组合而不是继承.这种哲学是有道理的-一个模型不是一个方向,它一个(是的,我知道的就是,一个过一件事只是一个启发式).然而,对于所有那些可能的子类重写相同的包装器方法似乎是不必要的,几乎完全不太优雅,只需要获得该功能.事情model.getOrientation().set_x(1)似乎也很愚蠢.

我可以看出为什么这对于小对象来说不会"太糟糕",但是对于这个例子(以及其他类似的例子),如果你不得不通过箍来假装你正在使用继承,那么构成的重点是什么?我现在应该使用它吗?我几乎可以肯定我正在考虑这个问题.

小智 6

这可能看起来很愚蠢,但你model.getOrientation().set_x(1)可能还是要走的路.

如果您厌倦了键入getOrientation()部件,您可以尝试这样的事情:

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


Ste*_*sop 5

有一种廉价的方法可以避免大部分包装样板.

class model : private orientation {
  public:
    using orientation::set_x;
    ... etc ...
};
Run Code Online (Sandbox Code Playgroud)

C++中的私有继承(并不一定)意味着"是一个".它对外人来说或多或少是不可见的,有时被描述为"以"来实现".也就是说,您将获得有限形式的合成,这有助于您展示组合对象的部分或全部接口.