我一直在努力想出最好的方法来分发我的部分游戏代码,但不是全部,以允许人们修改游戏而不是使用我的代码创建独立游戏。这就是许多游戏已经运行的情况,例如 Doom3 - 在 GPL 发布之前,SDK 只是为不可修改的 EXE 创建 DLL 的代码的一部分。
为此,我成功地将我的代码拆分为一个 EXE/SDK,但我担心的是 EXE 引用了 SDK 中的类。例如,如果我编译的 EXE 包含一个 Entity 类型的对象数组,在 SDK 中声明了 Entity,然后我将另一个成员变量添加到该类,编译 DLL,然后运行旧的 EXE新的 DLL,这是否意味着 EXE 具有关于实体大小的错误信息?
还是我想多了?
最佳答案
“如果你修改这个类,它不会与其他地方定义的类一起工作。”有一大堆问题。
对于这些问题也有很多解决方案。
通常使用(智能)指针和/或引用而不是类本身来形成接口(interface)可以避免代码的两个部分必须就类的大小达成一致。
因此,例如,而不是:
class EntityCollection
{
private:
vector <Entity> entities;
public:
void addEntity(Entity e) { entities.push_back(e); }
void removeEntity(Entity e) { ... }
};
我们将使用指针式存储(实际上应该使用智能指针,但为了简短起见,我没有这样做):
class EntityCollection
{
private:
vector <Entity*> entities;
public:
void addEntity(Entity* e) { entities.push_back(e); }
void removeEntity(Entity* e) { ... }
};
现在,无论实体有多大,或者它包含什么,它在 vector 中仍然是“指针大小”。
另一种变体是具有“pimpl”界面。您有一个主类定义,其中是一个指向实现类的(智能)指针,它提供了一组已知的虚函数。
像这样:
class Entity
{
public:
class EntityImpl
{
virtual int func() = 0;
...
};
Entity(EntityImpl* impl) pImpl(impl) {}
...
int func() { return pImpl->func(); }
private:
EntityImpl* pImpl;
};
这些当然不是您唯一可能关心的问题,但应该会给您一些“这是您用来解决问题的东西”的想法。
关于c++ - 使用 DLL 作为 C++ 游戏 SDK 发布的安全性(dll 已修改,exe 永不修改),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17279647/