我正在尝试构建一个 DLL,它将作为单例管理我的项目的各种配置选项。
我遵循了建议的方法 here in the chosen answer ,如下图:
IBuildConfiguration.h
#if defined(BUILD_CONFIGURATION_LIBRARY_EXPORT)
# define BUILD_CONFIGURATION_API __declspec(dllexport)
#else
# define BUILD_CONFIGURATION_API __declspec(dllimport)
#endif // BUILD_CONFIGURATION_LIBRARY_EXPORT
class IBuildConfiguration
{
public:
virtual int foo(void) = 0;
};
BUILD_CONFIGURATION_API IBuildConfiguration& Instance(void);
BuildConfiguration.h
class BuildConfiguration : public IBuildConfiguration
{
public:
BuildConfiguration();
~BuildConfiguration();
virtual int foo(void);
};
编辑:忘记包含 Instance()
BuildConfiguration.cpp
int BuildConfiguration::foo(void)
{
return 1; //just a silly example
}
IBuildConfiguration& Instance(void)
{
static BuildConfiguration instance;
return instance;
}
现在,在 Visual C++ 6 中,我在我的项目中添加了对这个新 DLL 的依赖,并在我的源代码中包含了 IBuildConfiguration header :
SystemCtrl.cpp
#include "../../BuildConfiguration/IBuildConfiguration.h"
IBuildConfiguration buildConfig = Instance();
我的 DLL 构建成功,但使用它的项目却没有。
不幸的是,这会导致以下错误:
int __thiscall IBuildConfiguration::foo(void)' : pure virtual function was not defined
将 DLL 和 LIB 文件复制到项目中似乎无法解决问题。
最佳答案
如果 IBuildConfiguration
没有纯虚函数,这仍然不会像您期望的那样工作:
IBuildConfiguration buildConfig = Instance();
这基本上是说“从 Instance()
的返回值复制构造一个 IBuildConfiguration
的实例”。派生类信息丢失。这是切片。您需要您的变量作为引用:
IBuildConfiguration& buildConfig = Instance();
关于c++ - Singleton DLL 中未定义的纯虚函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35805494/