2010-11-19 16 views
1

C++:メンバオブジェクト(オブジェクトB)を含む基本オブジェクト(オブジェクトA)があります。メンバオブジェクトインターフェイス(オブジェクトB)は、オブジェクトAへのポインタを介して完全に公開する必要があります。これを行う最もよい方法は何ですか?私はオブジェクトをパブリックメンバーとして置くことができますが、これはハックのように感じます。私はAのすべてのBのインターフェイスのラッパーを書くことができましたが、これは醜い感じです。私はオブジェクトをマージすることができますが、私はXMLにクラスのシリアル化を行っているので、別のクラスを持つことはよりクリーンです。私は友人のクラス分けについて考えましたが、私はこの状況に当てはまるとは思わない。C++でメンバオブジェクトインタフェースを公開する方法

このタイプの問題を解決するための標準的な方法は何ですか?

+0

おそらくオブジェクトBへのポインタを返すゲッター関数ですか? – cdhowie

+0

Bを公開する必要がありますが、その操作はconst修飾できますか? – robert

+0

いいえ、この場合はconstではありません。それは変更可能である必要があります。 – hd112

答えて

0

私はこのことをまったくお勧めしないという考えを拒否しますが、私はそれを一般のメンバーにします。あなたが好きではない場合は、getB()メソッドを使用できます。可能であれば、私はそれが通常の参照の代わりにconst参照を返すようにします。

1

Bは、インターフェイスIBを実装します。 ABのインスタンスを内部的に管理し、getBというゲッターを持ち、プライベートBインスタンスのIBインターフェイスを返します。 Bインスタンスを保護する場合は、IBのメソッドconstを作成し、デストラクタを非表示にすることができます(IBで非公開にする)。

class IB { 
private: 
    ~IB(); 
public: 
    virtual void method1() = 0; 
    virtual void method2() = 0; 
}; 

class B : public IB { 
public: 
    virtual void method1() {}; 
    virtual void method2() {}; 

    void destruct() { delete this; } 
}; 

class A { 
private: 
    B myB; 
public: 
    IB *getB() { return &myB; } 
}; 

(これは単にアイデアを与えることです、私は最後の私はいくつかの露骨なエラーを作ることができ++ Cに触れたので、それは3年以上となっています。。。)

0

過負荷を - > Aでとでオペレータ実装はタイプBのポインタ変数を返します。 しかし、あなたが知っているように、Aのポインタと - >を介してAのメンバーにアクセスすることはできません。また、コードを読んだことのある混乱を招く危険もあります。 私はこのようなものを意味しました。

struct A 
{ 
    B *p; 
    B * operator ->() 
    { 
    return p; 
    } 
}; 
関連する問題