gpt4 book ai didi

c++ - 使用 DLL 覆盖/修改 C++ 类

转载 作者:行者123 更新时间:2023-11-27 23:34:55 26 4
gpt4 key购买 nike

我有一个由我维护的大型代码库(>200,000 行代码)(“核心”)项目。

目前,这个核心有一个脚本引擎,它由钩子(Hook)和一个脚本管理器类组成,当它们出现时调用所有钩子(Hook)函数(通过 DLL 注册)。老实说,我不知道它到底是如何工作的,因为核心大部分都没有记录,并且跨越了数年和大量的开发人员(当然,他们缺席)。当前脚本引擎的一个例子是:

void OnMapLoad(uint32 MapID)
{
if (MapID == 1234)
{
printf("Map 1234 has been loaded");
}
}

void SetupOnMapLoad(ScriptMgr *mgr)
{
mgr->register_hook(HOOK_ON_MAP_LOAD, (void*)&OnMapLoad);
}

名为 setup.cpp 的补充文件使用核心的 ScriptMgr 调用 SetupOnMapLoad

这种方法不是我要找的。对我来说,完美的脚本引擎应该是允许我覆盖核心类方法的引擎。我希望能够创建继承自核心类并在其上扩展的类,如下所示:

// In the core:    
class Map
{
uint32 m_mapid;
void Load();
//...
}

// In the script:
class ExtendedMap : Map
{
void Load()
{
if (m_mapid == 1234)
printf("Map 1234 has been loaded");

Map::Load();
}
}

然后我希望核心和脚本中的每个 Map 实例实际上都是 ExtendedMap 的实例。

这可能吗?怎么办?

最佳答案

继承是可能的。我没有看到用 ExtendedMap 实例替换 Map 实例的解决方案。

通常,如果您有工厂类或函数,您就可以这样做,它总是用于创建 Map 对象,但这是现有(或不存在)设计的问题。

我看到的唯一解决方案是在代码中搜索实例化并尝试手动替换它们。这是一个有风险的做法,因为您可能会错过其中的一些,并且可能是某些实例化不在您可用的源代码中(例如在那个旧的 DLL 中)。

稍后编辑如果以多态方式使用它,这种方法覆盖也会产生副作用。

例子:

Map* pMyMap = new ExtendedMap; 

pMyMap->Load(); // This will call Map::Load, and not ExtendedMap::Load.

关于c++ - 使用 DLL 覆盖/修改 C++ 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1289482/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com