設計で作成されたモデルが実際のC++コードではどのような実装になるのかのメモ書き。
多重度「1」の関連の場合、ClassAが存在する限り、ClassBが常に存在することを意味します。
Class A{ private: ClassB* roleB; public: ClassA(ClassB* relatedB){ setRoleB(relatedB); } void setRoleB(ClassB* relatedB){ this.roleB = relatedB; } };
多重度「0..1」の場合、ClassAのインスタンスが生成されたときに、必ずClassBのインスタンスポインタを持っている保障はないと考えるのが一般的。
Class A{ private: ClassB* roleB; public: ClassA(){} void setRoleB(ClassB* relatedB){ roleB = relatedB; } };
多重度「*」は、0個以上の複数のClassBオブジェクトが存在するということになります。
Class A{ private: std::vector<ClassB*> vRoleB; public: ClassA(){} void setRoleB(ClassB* relatedB){ vRoleB.push_back(relatedB); } };
多重度「0..n」は、関連を表す属性に複数のオブジェクトを登録可能ですが、登録数に上限があるように実装しなければならない。
Class A{ private: ClassB* vRoleB[n]; public: ClassA(){} void setRoleB(int index, ClassB* relatedB){ vRoleB[index]=relatedB; } };
集約関係の場合は、明示的に「連鎖的削除の概念」が無いことを示すことができます。
Class A{ private: ClassB* roleB; public: ClassA(ClassB* relatedB){ setRoleB(relatedB); } void setRoleB(ClassB* relatedB){ roleB = relatedB; } };
コンポジションは、より強い集約の一種です。ClassBインスタンスはClassBインスタンスと共に生存し、消滅すると考えられます。
Class A{ private: ClassB* roleB; public: ClassA(){ *roleB = new ClassB(); } ~ClassA(){ delete roleB; } void operation(){ .......... roleB.operation(); .......... } };
依存関係は、パラメータ参照やオブジェクト生成といった一時的な関係を表します。
Class A{ private: public: ClassA(){} ~ClassA(){} void operation(){ ClassB classB; classB.operation(); } };