首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >单例DLL中未定义的纯虚函数

单例DLL中未定义的纯虚函数
EN

Stack Overflow用户
提问于 2016-03-04 20:30:59
回答 2查看 224关注 0票数 1

我正在尝试构建一个DLL,它将作为Singleton管理我的项目的各种配置选项。

我遵循了提议的here in the chosen answer方法,如下所示:

IBuildConfiguration.h

代码语言:javascript
复制
#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

代码语言:javascript
复制
class BuildConfiguration : public IBuildConfiguration
{
    public:

        BuildConfiguration();
        ~BuildConfiguration();


        virtual int foo(void);
};

Instance()编辑:忘记包括的实现

BuildConfiguration.cpp

代码语言:javascript
复制
int BuildConfiguration::foo(void)
{
    return 1; //just a silly example
}

IBuildConfiguration& Instance(void)
{
    static BuildConfiguration instance;
    return instance;
}

现在,在Visual 6中,我在我的项目中添加了一个对这个新C++的依赖项,并且我在我的源代码中包括了IBuildConfiguration头,如下所示:

SystemCtrl.cpp

代码语言:javascript
复制
#include "../../BuildConfiguration/IBuildConfiguration.h"

IBuildConfiguration buildConfig = Instance();

我的DLL成功构建,但是使用它的项目没有.

不幸的是,这会导致以下错误:

代码语言:javascript
复制
int __thiscall IBuildConfiguration::foo(void)' : pure virtual function was not defined

将DLL和LIB文件复制到项目中似乎解决不了这个问题。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-03-04 21:16:27

如果IBuildConfiguration没有纯虚拟函数,那么它仍然不能像您所期望的那样工作:

代码语言:javascript
复制
IBuildConfiguration buildConfig = Instance();

这基本上是“从IBuildConfiguration的返回值复制-构造一个Instance()实例”。派生类信息丢失。这是切片。您需要您的变量作为引用:

代码语言:javascript
复制
IBuildConfiguration& buildConfig = Instance();
票数 2
EN

Stack Overflow用户

发布于 2016-03-04 20:39:41

确保实例方法如下所示

代码语言:javascript
复制
 IBuildConfiguration& Instance()
 {
    // Creates instance of derived class all is good.
    static BuildConfiguration inst;
    return inst;
 }

而不是:

代码语言:javascript
复制
 IBuildConfiguration& Instance()
 {
    // Tries to create instance of base class.. Not possible as it
    // has pure virtual functions.
    static IBuildConfiguration inst;
    return inst;
 }

Dark是正确的,您需要将来自Instance()方法的返回存储在对基类的引用中,否则它将试图通过调用基类复制构造函数来创建基类的新实例:)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35805494

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档