gpt4 book ai didi

c++ - 关注点分离 : Create base library and remove dependencies on concrete classes

转载 作者:行者123 更新时间:2023-11-28 08:21:55 26 4
gpt4 key购买 nike

我们有一种情况,我们为应用程序开发 DLL 插件。所有插件都有一组通用的源文件。但是,我希望将它们分离到一个基础库中。我们有以下实现,它们只是一个 DLL 项目的一部分:

// dllentry class
BaseImporter* spImporter = NULL;
extern BaseImporter* createImporterImplementation(const std::string& pDllFileName);

int __stdcall DllImportOpen(
const char* pDllFileName,
const char** ppImporterUniqueName,
const char** ppImporterVersion)
{
// method implementation in concrete class source file
spImporter = createImporterImplementation(pDllFileName);

(*ppImporterUniqueName) = spImporter->GetUniqueName();
(*ppImporterVersion) = spImporter->GetImporterVersion();
return (0);
}

// base importer class

class BaseImporter()
{
public:
const char* GetUniqueName() const {return mUniqueName.c_str();}
const char* GetImporterVersion() const {return mVersion.c_str();}
protected:
// some pure virtual methods here
}

// concrete class
class XImporter : BaseImporter()
{
// implement base importer
}

// resides in XImporter source file
BaseImporter* createImporterImplementation(
const std::string& dll_filename)
{
return new XImporter (dll_filename);
}

当作为 1 个 DLL 一起构建时,这工作正常。但是,我想将 dllentry 类和 BaseImporter 分离到一个基础库中。这显然会在编译基础库时产生链接器错误,因为它将搜索 createImporterImplementation 的实现。我怎样才能很好地分离出可以与具体库一起使用的基础库?

最佳答案

一种解决方案是后期绑定(bind)到 createImporterImplementation。尝试类似的东西(注意,根本没有测试,可能在细节上是错误的)

// in base DLL:
BaseImporter* createImporterImplementation(
const std::string& dll_filename)
{
HMODULE h - LoadLIbrary (dll_filename.c_str());
BaseImporter* (*fn)() = GetProcAddress(h, CreateImporterImplementation);
return (*fn)();
}

然后在具体的导入器中:

__declspec(dllexport) BaseImporter* createImporterImplementation()
{
return new XImporter;
}

这是否回答了问题?

关于c++ - 关注点分离 : Create base library and remove dependencies on concrete classes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5509655/

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