1

Cクラスを継承するAクラスとBクラスとする。すべては、Main クラスのメソッド main とともに file.cpp にあります。クラスAのインスタンスを作成したい場合は...

ファイル.cpp

 class C{
 }

 class A : public C{
 }

 class B : public C{
 }
 class Main{
 .
 .
 .
 void main(){
    C *c = new A();
 }
 }

ダイアグラム UML の場所

ここに画像の説明を入力

ここで、同じクラスがあり、各クラスが異なるファイルにあるとします。上記のように、クラス A をインスタンス化する場合は、Main クラスに #include Ah ディレクティブを挿入し、ダイアグラムに依存関係を表示します。

私の質問は次のとおりです。同じことをしたい場合、どのケースが正しいですか? または、C++ の関係 UML を間違って解釈していますか?

ここに画像の説明を入力

4

3 に答える 3

1

インスタンスがあることを示すには、合成関係を使用する必要があります。Main C

別のファイルに存在するクラスの機能が必要な場合は、おそらくインクルードが必要になると思われるため、どのファイルをインクルードする必要があるかについては文書化していません。

編集:実際には、クラスにはクラスのインスタンスを作成するメソッドが呼び出され、メンバー自体ではないように見えるため、構成はありません。Mainmain()C

于 2013-02-15T02:09:19.033 に答える
1

まず、何をしているのかを理解していない限り、コードを .h ファイルに入れるべきではありません (主に速度のために使用されるインライン関数を参照してください)。

次に、main.h では、A への参照は必要ありません。ただし、main.cpp では、Ah を含める必要があります。UML は言語にとらわれないことを思い出してください。誰とコンパイルします」。

多くの場合、c++ コンパイラは、cpp ファイルごとに出力ファイルを生成します (gcc では、これらは .o ファイルです。Visual Studio もこれを行いますが、透過的に行います)。その後、すべての出力ファイルがアプリケーションまたはライブラリで (ほとんどの場合) マージされ、関数がリンクされます。

また、前方参照も参照してください。コンパイラ (リンカではなく) に、「このクラスは存在します。今は知らないかもしれませんが、神に誓って、リンカの出力 blob に存在します」と伝えることです。

あなたの特定のケースでは、1 つまたは複数の cpp ファイルのみを使用するかどうかに関係なく、2 番目の例のようにクラス図を描画します。メイン クラスは A について知っています。

Cクラスに次のようなメソッドがあると想像してください

A* C::createA()
{
    return new A;
}

B* C::createB()
{
    return new B;
}

次に、メインクラスは

int main()
{
    C* instance1 = C::createA();
    C* instance2 = C::createB();
}

その場合、メイン クラスは A と B に関する詳細な知識をすべて失い、最初の図に準拠します。これはもちろん、A、B、C 間の結合をさらに作成し、それ自体の問題を引き起こしますが、ファクトリ パターンにより近くなります。

于 2013-02-15T03:19:09.300 に答える
1

暗示されているため、2 番目の図のように has-a 関係を持つ必要はないと思います。

A は C、B は C、Main は C です。

ファイルのインクルードよりも、デザインの構造に関するものです。

于 2013-02-15T02:26:54.053 に答える