我正在尝试构建一个DLL,它将作为Singleton管理我的项目的各种配置选项。
我遵循了提议的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 6中,我在我的项目中添加了一个对这个新C++的依赖项,并且我在我的源代码中包括了IBuildConfiguration头,如下所示:
SystemCtrl.cpp
#include "../../BuildConfiguration/IBuildConfiguration.h"
IBuildConfiguration buildConfig = Instance();我的DLL成功构建,但是使用它的项目没有.
不幸的是,这会导致以下错误:
int __thiscall IBuildConfiguration::foo(void)' : pure virtual function was not defined将DLL和LIB文件复制到项目中似乎解决不了这个问题。
发布于 2016-03-04 21:16:27
如果IBuildConfiguration没有纯虚拟函数,那么它仍然不能像您所期望的那样工作:
IBuildConfiguration buildConfig = Instance();这基本上是“从IBuildConfiguration的返回值复制-构造一个Instance()实例”。派生类信息丢失。这是切片。您需要您的变量作为引用:
IBuildConfiguration& buildConfig = Instance();发布于 2016-03-04 20:39:41
确保实例方法如下所示
IBuildConfiguration& Instance()
{
// Creates instance of derived class all is good.
static BuildConfiguration inst;
return inst;
}而不是:
IBuildConfiguration& Instance()
{
// Tries to create instance of base class.. Not possible as it
// has pure virtual functions.
static IBuildConfiguration inst;
return inst;
}Dark是正确的,您需要将来自Instance()方法的返回存储在对基类的引用中,否则它将试图通过调用基类复制构造函数来创建基类的新实例:)。
https://stackoverflow.com/questions/35805494
复制相似问题