2016-11-04 23 views
2

私のコードを設計するために、私はいくつかのUMLクラス図を描いています。 私はいくつかの共有オブジェクトを持っています。これらのオブジェクトの所有権は実際に共有されているので、どのように描くべきなのでしょうか?私はクラス図では、これら3つのクラス間の関係を表現するにはどうすればよいUMLで共有オブジェクトを表現する方法は?

class A 
{ 
public: 
    A(){ 
    std::shared_ptr<CSharedObj> sharedObj = std::make_shared<CSharedObj>; 
    mB = B(sharedObj); 
    } 
private: 
    B mB; 
}; 

class B 
{ 
public: 
    B(std::shared_ptr<CSharedObj>); 
private: 
    std::shared_ptr<CSharedObj> mSharedObj; 
}; 

class CSharedObj 
{ 
public: 
    CSharedObj(); 
}; 

: はここで何が起こっているかのC++の例具体的には?

+0

なぜ 'B'は' CSharedObj'の共有所有権を必要としますか? 'B'の存続期間は' A'の存続期間と同じですので、安全に 'CSharedObj'への非所有ポインタを持つことができますか? –

+0

あなたの言うことは理論的には正しいですが、アーキテクチャは上記の例より少し複雑です。アイデアは、Aが必要なものすべてを作成し、それを各サブコンポーネントに配布することです(A、B、B、B、BnはAによって作成されたリソースを共有しています)。ハードウェアモジュールと1対1の関係を持つため、複数のリソースを作成する必要はありませんが、Biに初期化して渡す以外は何もしないため、Aに格納する必要はありません。 –

+0

「A」に共有オブジェクトが格納されていないことがわかりました。 –

答えて

2

UMLでは、このC++コードをダイアグラムにどのように反映させるかを定義していません。そこいくつかのオプションがあり、ここに私の提案です:

enter image description here

Aの親インスタンスが破壊されたときにBのインスタンスが破壊されているので、私は、mBのための組成物(満たされたダイヤモンド)を使用していました。

CSharedObjectのインスタンスは複数の所有オブジェクトによって共有される可能性があるため、mSharedObjの共有集約(オープンダイヤモンド)を使用しています。プロジェクト全体を通して、shared_ptrが指すオブジェクトがクラス図で共有集約関係を使用して表されるという規則を設定することができます。

このクラス図では、Aによって作成されたCSharedObjectのインスタンスがmSharedObjによって指し示された同じインスタンスであることを指定していないことに注意してください。必要に応じて、この事実を説明するメモを追加することができます。あなたが本当にあなたのダイアグラムでのshared_ptrを表示したい場合は

、あなたはこのようにそれを行うことができます:

enter image description here

参照UML 2.5仕様のセクション9.3をテンプレートの分類の詳細については。

+0

さて、 'CSharedObject'は名前が言うものです:オブジェクトです。クラスではありません。あたかもクラスとオブジェクトがクラスであるかのように喜んで混在させます。 –

+0

@ThomasKilian; C++で開発したのはずっと前ですが、クラスだと思います。 http://en.cppreference.com/w/cpp/memory/shared_ptrの例を参照してください。それはインスタンス化されたときのようなものの後にクラスの名前を付ける良い命名規則です。たとえば、すべてのPersonがオブジェクトであるにもかかわらず、「Person」はクラスの適切な名前です。 –

+0

クラスは 'class'キーワードの後に​​定義されます。 OPは間違って、インスタンスという意味のclassという単語を使用しています。 –

関連する問題