对库管理员类的运行时访问
Runtime access to librarian classes?
我有一些应用程序和静态库C++解决方案:
- 用户种族1.exe
- 用户种族2.exe
- 绿色身体
- 蓝体网
- 红体网
- BigWheels.lib
- MiddleWheels.lib
- 小轮子.lib
- V8引擎
- V12引擎.lib
- RaceTires.lib
- 冬季轮胎网
- 简单轮胎.lib
- 车库.lib
在应用程序中,我只是模拟比赛,每个种族一个应用程序。Libs 由描述汽车部件(车身、车轮、发动机等)的类组成。每个类都实现一些接口(IBody,IWheels,IEngine等),这些接口在Garage lib中描述。Garage.lib应该使用零件制造汽车。
因此,我将汽车参数传递给应用程序,例如:-Car1 -红体 -中轮 -V8发动机 -赛车轮胎 -汽车2 -蓝体 -小轮子 -V12发动机 -冬季轮胎 。应用程序调用车库类:车库::GetCar(弦体,弦轮,弦发动机,弦轮胎)和车库返回汽车对象,我们在应用程序中使用的。请注意,我像字符串一样传递此参数。这很重要。
现在,关于我想要什么。我只写车库库。其他库将由其他人编写。我希望我的图书馆是通用的。此时,当添加新部分(例如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 获得完全"动态"的解决方案,前提是:
- 您可以从字符串"BlackBody"派生一个 Dll 名称("BlackBody.dll")
- 每个 Dll 导出一个工厂函数,具有可预测的名称("工厂"或"BlackBodyFactory")
- 动态加载 Dll,并通过 GetProcAddress 获取工厂指针函数
- 你的 Garage.lib 代码只知道 Body 基类,因为这是"body"工厂函数将返回的内容
应避免在同一过程中混合使用不同的 CRT。混合是可能的,但需要额外的护理/工作。
相关文章:
- 通过switch和static_cast访问多态对象的运行时类型
- 从反向顺序C++访问矢量时运行时出错
- 运行时多态性 - 箭头运算符访问了错误的成员?
- 以这种方式在运行时访问元组的性能成本
- 在C++中使用链表的堆栈实现中,访问结构体headNode成员count和top会导致运行时错误
- 在VS2015中访问类成员时运行时错误,但在Linux上未访问时出错
- 访问使用 Bazel 构建的应用程序中的运行时文件
- 在运行时C++11 个索引模板参数包,以便访问第 N 种类型
- 未经授权的私有类成员访问会产生编译时错误而不是运行时错误?
- 访问导致运行时错误的动态数组
- 在C 中运行时从指针访问对象实例
- 如何避免对编译后无法访问的正在运行的代码部分进行运行时检查?
- 是否可以在运行时选择可以访问类的私有成员的函数
- 目标C运行时访问屏幕尺寸
- 为什么会出现访问冲突运行时错误
- C 运行时字段访问
- C 运行时成员函数通过字符串名称访问
- 在运行时按索引访问 std::tuple 元素的最佳方法
- 对库管理员类的运行时访问
- 在运行时访问v表