いくつかのアプリと静的ライブラリを使用した C++ ソリューションがあります。
- UserRace1.exe
- UserRace2.exe
- GreenBody.lib
- BlueBody.lib
- RedBody.lib
- BigWheels.lib
- MiddleWheels.lib
- SmallWheels.lib
- V8Engine.lib
- V12Engine.lib
- RaceTires.lib
- WinterTires.lib
- SimpleTires.lib
- Garage.lib
アプリケーションでは、レースごとに 1 つのアプリケーションをシミュレートするだけです。ライブラリは、車のパーツ (ボディ、ホイール、エンジンなど) を記述するクラスで構成されます。すべてのクラスは、Garage lib. また、Garage.lib はパーツを使用して車を作成する必要があります。
したがって、車のパラメーターをアプリケーションに渡します。例: -Car1 -RedBody -MiddleWheels -V8Engine -RaceTires -Car2 -BlueBody -SmallWheels -V12Engine -WinterTires 。アプリケーション呼び出し Garage クラス: Garage::GetCar(文字列の本体、文字列の車輪、文字列のエンジン、文字列のタイヤ) とガレージの戻り車オブジェクト、アプリで使用します。この引数を文字列のように渡すことに注意してください。それは重要です。
さて、欲しいものについて。私はGarage libのみを書いています。他のライブラリは他の人によって書かれます。そして、私のライブラリが普遍的であることを望んでいます。この時点で、新しいパーツ (BlackBody.lib など) が追加されたら、Garage.lib にこれのサポートを追加する必要があります。何かのようなもの:
...
else if (body == "RedBody")
{
car->body = new RedBody();
}
else if (body == "BlackBody")
{
car->body = new BlackBody();
}
...
しかし、私はこのタイプを動的に取得したいと考えています。お気に入り:
foreach (Librarian lib in Application.GetLibs())
{
foreach (Type type in lib)
{
if (type is IBody)
{
if (((IBody)type)::GetColor() == color)
{
car->body = type.GetInstance();
return;
}
}
}
}
その後、誰かが新しいタイプを追加しても、ライブラリは変更しません。問題は、私が C# ではなく C++ で書いていることです。そして、私はそれを実装する方法がわかりません。
たぶん、静的ライブラリの代わりにdllを使用する必要がありますか? これは唯一の方法ですか?もしそうなら、アプリケーションと dll が 1 つのライブラリ (Garage.lib) を使用することに問題はありますか? 異なるランタイム ライブラリ (/MT と /MD) を使用しているためです。