c++ - 运行时访问图书管理员类?

标签 c++ reflection dll static-libraries

我有一些应用程序和静态库的 C++ 解决方案:

  • UserRace1.exe
  • UserRace2.exe
  • 绿体库
  • 蓝体.lib
  • RedBody.lib
  • BigWheels.lib
  • MiddleWheels.lib
  • SmallWheels.lib
  • V8Engine.lib
  • V12Engine.lib
  • RaceTires.lib
  • WinterTires.lib
  • SimpleTires.lib
  • 车库.lib

在应用上,我只是模拟比赛,每场比赛一个应用。库由描述汽车部件(车身、车轮、发动机等)的类组成。每个类都实现了一些在 Garage 库中描述的接口(interface)(IBody、IWheels、IEngine 等)。 Garage.lib 应该使用零件来制造汽车。

因此,我将汽车参数传递给应用程序,例如:-Car1 -RedBody -MiddleWheels -V8Engine -RaceTires -Car2 -BlueBody -SmallWheels -V12Engine -WinterTires。应用程序调用 Garage 类:Garage::GetCar(string body, string wheels, string engine, string tires) 和 garage return Car 对象,我们在应用程序中使用。请注意,我将此参数作为字符串传递。这很重要。

现在,关于我想要的。我只写车库库。其他库将由其他人编写。我希望我的图书馆是通用的。此时,当添加新部件(例如 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 使用一个库(Garage.lib)的问题?因为他们使用不同的运行时库(/MT 和/MD)。

最佳答案

您可以拥有一个完全“动态”的解决方案,使用 DLL,前提是:

  1. 您可以从字符串“BlackBody”派生出一个 Dll 名称(“BlackBody.dll”)
  2. 每个 Dll 导出一个工厂函数,具有可预测的名称(“Factory”或“BlackBodyFactory”)
  3. 动态加载Dll,通过GetProcAddress获取工厂指针函数
  4. 您的 Garage.lib 代码只知道 Body 基类,因为这是“body”工厂函数将返回的内容

您应该避免在同一个进程中混用不同的 CRT。混合是可能的,但需要额外的照顾/工作。

关于c++ - 运行时访问图书管理员类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19843321/

相关文章:

c++ - OpenMP 和 STL vector

c++ - 有没有办法轻松处理返回 std::pairs 的函数?

html - Go template/html 迭代从结构生成表

java - 在 Scala 中使用 Java 类时出现 "ambiguous reference to overloaded definition"

c# - System.ExecutionEngineException 仅在调试时出现

delphi - 如何将 Bitmap 传递到 C++ 和 Delphi 中的 DLL 函数中?

c++ - std::transform 的功能版本

c++ - 提高期望最大化的绩效

parsing - 获取有关 Groovy 函数的信息(名称、签名、主体代码)

c++ - 如何在动态加载的 DLL 中正确实现 (C++) 线程本地存储?