2013-04-09 58 views
4

我有一個簡單的Object-Components設計。喜歡的東西:在C++中暴露成員變量方法

class Object1 : public Object 
{ 
    Component1 _comp1; 
    Component2 _comp2; 
    ... 
    ComponentN _compN; 
}; 

是否有可能暴露爲Objects1public:方法的一些方法從ComponentK而不在Object1一個方法調用內部ComponentK方法?

我需要一個簡單的方法來做到這一點,因爲每次我想公開一些ComponentK方法時,寫一個函數是相當煩人的。

+0

如果'_compK'和你想調用的方法都是公共的,爲什麼不是'obj1instance - > _ compK.method()'? – msam 2013-04-09 06:42:21

+3

@msam因爲_compK是私人的嗎? – juanchopanza 2013-04-09 06:47:56

回答

11

不直接,沒有。您可以使用私有繼承從組件繼承而不是彙總它們(請注意,私有繼承不會表達is-a),然後通過using發佈其某些成員函數。事情是這樣的:

class Object1 : public Object, private Component1, private Component2, ..., private ComponentN 
{ 
public: 
    using Component1::function1(); 
    using Component1::function2(); 
    ... 
    using ComponentN::functionM(); 
}; 

我不是說這是一定要做的最佳方式,但它是一個方式

+0

請注意,儘管私有繼承隱含** has-a **而不是** is-a **關係,因此'Component *'類是接口的一部分,因爲Object1的客戶端需要了解它們。您不能使用例如[PIMPL](http://herbsutter.com/gotw/_100/)成語。 – 2013-04-09 06:53:12

+5

當您將對象繼承到類的私有區域時,它不是真正的* has-a *關係。它是has-a和is-a之間的混合體,更好地被稱爲「被實施的」。 – Bingo 2013-04-09 07:06:34