1

弾丸の放物線飛行のシミュレーション(単純な長方形)を作成する必要があり、条件の1つは、すべての計算を自作ライブラリ内で行い、そのためのインターフェース(抽象クラ​​ス)を作成することです。これを実装する方法が混乱しています:

  • 「get()」と「set()」を介してクラスを使用する完全に抽象化されたクラスといくつかの関数 (クラス内のメソッドではない) を作成しますか?
  • 彼のメソッドにすべての計算が実装されたクラスを作成し、1 つの「描画」メソッドだけを純粋仮想にしますか?

私は WinAPI を使用しており、すべてのグラフィックスは GDI を介して使用しています

そして、どんな助けにも本当に感謝します

4

2 に答える 2

1

Windows、ライブラリ、および抽象クラスをインターフェイスとして話しているとき、DLL 間でクラスを共有することを考えているのでしょうか。

キーワードがありますが、declspec(dllexport)これをクラスやクラス メンバーで使用するのは良くありません。すべてのライブラリ コードが密接に結合され、同じコンパイラ バージョンとすべての設定を使用することに完全に依存することになります。

たとえば、一度に 1 つの DLL のコンパイラをアップグレードできるはるかに優れたオプションは、インターフェイス ポインターを渡すことです。ここで重要なのは、ライブラリの利用者がクラス レイアウトについて何も知らないということです。インターフェイスは、インライン化される可能性のあるデータ メンバーまたは非仮想関数を記述しません。パブリック仮想関数のみがインターフェイスに表示されます。これは、パブリック ヘッダーで定義された単なるクラスです。

DLL には、インターフェイスから継承する実際の実装があります。コンシューマーが持っているのは、仮想関数テーブルと、新しいオブジェクトへのポインターを返すファクトリ (プレーンな古い C 互換関数) だけです。

これを行うと、コンシューマが依存するバイナリ インターフェイスを変更することなく、好きなように実装を変更できるため、再コンパイルせずに動作し続けます。これは、Windows での COM オブジェクトの動作の基本です。

于 2013-11-07T20:10:06.337 に答える
1

クラスを作成する目的の 1 つは、すべての非相対データと操作を異なるクラスに分離することです。

あなたの場合、一部は計算であり、他の部分は結果のレイアウトです。

したがって、それを実装する最善の方法は、すべての計算と結果へのアクセスを提供するクラスを定義し、計算クラスのオブジェクトを使用する描画関数を実装することです。

したがって、コードを変更することなく、他の環境 (たとえば、他のプロジェクト) で計算を使用できるようになります。これは当然のことです。プラットフォームに依存しない計算コードの移植性を提供します。

また、プラットフォームに依存するレイアウト部分は、計算クラスが提供するインターフェースのみを使用して、個別に実装する必要があります。

    class Trajectory
    {
    public:
         // Constructor, computation call methods
         // "GetResult()" function,
         //     which will return trajectory in the way you choose
         ...
    private:
         // computation functions
    };

    // somewhere else
    void DrawTrajectory(Trajectory t)
    {
        // here is a place for calling all winapi functions
        //     with data you get using t.GetResult() 
    }

抽象クラスが必要な場合は、Trajectory クラスを抽象クラスから継承する必要があります。ここで、呼び出す必要があるすべての関数を定義します。

この場合

    //
    class ITrajectory
    {
    public:
       // virtual /type/ GetResult() = 0;
       // virtual /other methods/
    };

    class Trajectory : public ITrajectory
    { 
       // the same as in previous definition
    };

    void DrawTrajectory(ITrajectory T)
    {
        // the same as in previous definition
    }
于 2013-11-07T19:08:30.183 に答える