【运行时动态性】如何实现运行时的动态性?例如类似运行时创建一个类的实例,或者运行时动态调用一个未知模块的已知名方法

天乐_那由他 2009-04-09 09:07:56
如何实现运行时的动态性?例如类似运行时创建一个类的实例,该类在编程时未知。

或者运行时动态调用一个方法,方法名已知,但是要调用的模块是动态配置的。


网上搜了很久,在Win下似乎多数是走MFC的思路,或者COM。感觉这种实现不是太好,但也不知道更好的方法了。

还有一些开源项目中的实现也是要求动态扩展的类派生自某个基类。

听说Unix/Linix系统下,早在C++未问世时就已实现一些动态扩展性,如IO的read(),write(),可以接驳多种设备。

盼高手解释一下它是否就是运行时动态调用扩展方法?

它是如何实现的呢?

其他能够达到目的的方法也请畅所欲言,望不吝赐教!

分不够再开贴。
...全文
118 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
天乐_那由他 2009-04-09
  • 打赏
  • 举报
回复
谢谢楼上诸位释疑。结贴了。

叶落寒山 2009-04-09
  • 打赏
  • 举报
回复
用脚本文件呢?
morris88 2009-04-09
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 agentianle 的回复:]
举个应用场景的例子:

类A实现了大部分的公用业务逻辑,其中需要调用的一个关键算法则需看场景使用不同的方法去处理,所有的关键算法可以抽象为统一的一个接口。

关键算法模块有很多,每个类都实现了算法接口。这些算法模块还可能会根据需求不断的增加或修改。

现在,想让类A实现二进制复用,而非代码复用。则类A需要在运行时根据一份配置文件,自适应的选择去调用哪个算法。

若算法是封装在类中的,则牵涉到一个…
[/Quote]

貌似这个用c可以实现。比如文件系统吧:提供公共接口open/read/write/close等;下面有很多不同的文件系统,如fat16/fat32/ntfs/ext2/ext3等,每一个对磁盘文件的存储格式都不一样,每个都向接口层注册其相应的open/read/write/close实现,在调用时根据不同的文件系统会转到不同的函数中去处理。

象crypto,你需要提出公共接口,然后每个crypto算法都向其注册,调用时直接调用公共接口实现(它根据不同算法转到不同的具体算法实现中),貌似就行了吧。
Wolf0403 2009-04-09
  • 打赏
  • 举报
回复
[Quote=引用楼主 agentianle 的帖子:]
如何实现运行时的动态性?例如类似运行时创建一个类的实例,该类在编程时未知。

或者运行时动态调用一个方法,方法名已知,但是要调用的模块是动态配置的。
[/Quote]
dlopen / dlsym,类似于Win32 的 LoadLibrary / GetProcAddress 这种。

[Quote=引用楼主 agentianle 的帖子:]
听说Unix/Linix系统下,早在C++未问世时就已实现一些动态扩展性,如IO的read(),write(),可以接驳多种设备。
[/Quote]
这个是用 C 实现 OO 罢了,回调 + 函数指针。
  • 打赏
  • 举报
回复
好好学习下.
天乐_那由他 2009-04-09
  • 打赏
  • 举报
回复
补充一下,lua结合C/C++确实是种很好的方式。

但我想知道Unix下的那种实现是否更好?至少不用再学习一门语言。

taodm 2009-04-09
  • 打赏
  • 举报
回复
解决这个问题的方法就是自己实现了一个lua解释器。
这种轮子,先用现成的,再考虑造不造。
天乐_那由他 2009-04-09
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 taodm 的回复:]
自己google lua/python和c/c++混合编程。
[/Quote]

谢谢你的建议,这些我也了解过。但我想在C/C++体系中解决此问题。

如果让C++结合其他语言实现此功能,则选择范围就很广阔了。

taodm 2009-04-09
  • 打赏
  • 举报
回复
自己google lua/python和c/c++混合编程。
天乐_那由他 2009-04-09
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 mengde007 的回复:]
http://dev.yesky.com/105/2030105.shtml
[/Quote]

谢谢这位朋友。

你的链接是讲对象的内存分配的,这些我已经比较清楚了。

链接中的文章很好的解释了堆、栈和静态存储区等内存分配问题,可惜未能解决本贴的问题。

感谢你的热心支持。
天乐_那由他 2009-04-09
  • 打赏
  • 举报
回复
举个应用场景的例子:

类A实现了大部分的公用业务逻辑,其中需要调用的一个关键算法则需看场景使用不同的方法去处理,所有的关键算法可以抽象为统一的一个接口。

关键算法模块有很多,每个类都实现了算法接口。这些算法模块还可能会根据需求不断的增加或修改。

现在,想让类A实现二进制复用,而非代码复用。则类A需要在运行时根据一份配置文件,自适应的选择去调用哪个算法。

若算法是封装在类中的,则牵涉到一个动态的类的实例化问题。
此即情形1:运行时创建一个类的实例,该类在编程时未知。

若算法不封装在类中,直接做成C风格的函数,则没有动态实例化的问题,但这样就没有接口规范了。
此即情形2:运行时动态调用一个方法,方法名已知,但是要调用的模块是动态配置的。
mengde007 2009-04-09
  • 打赏
  • 举报
回复
morris88 2009-04-09
  • 打赏
  • 举报
回复
不是特明白,能否举个例子嘛。
ylywyn136 2009-04-09
  • 打赏
  • 举报
回复
哦。。帮顶

64,645

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧