编译器要求接口虚拟构造函数?

时间:2014-09-25 19:15:05

标签: c++ interface

我正在努力实现类似于解释here的内容。

我将Interface类定义为:

class IInterface
{
public:

    virtual bool foo() = 0;
    virtual void destroy() = 0;
}

并且实现类定义为:

class MyImplementation : public IInterface
{
    MyImplementation();
    ~MyImplementation();

    virtual bool foo();
    virtual void destroy() {delete this;}

private:

    MyImplementation(MyImplementation const&);
    void operator=(MyImplementation const&);
}

extern "C" API MyInterface* __cdecl createMyImplementation();

这在使用VS2010的Release模式下工作正常,但在Debug模式下,编译器给出了这个错误:

MyImplementation.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: __thiscall IInterface::IInterface(void)" (__imp_??0IInterface@@QAE@XZ) referenced in function "public: __thiscall MyImplementation::MyImplementation(void)" (??0MyImplementation@@QAE@XZ)

问题是什么?我该如何解决这个问题?

根据我的理解,我们不应该有虚拟构造函数......(参见this question)。

编辑:

修正了拼写错误。 foo确实有一个正文,这是真实代码的简化版本。

解释破坏函数的原因:

http://www.parashift.com/c++-faq-lite/delete-this.html

http://eli.thegreenplace.net/2011/09/16/exporting-c-classes-from-a-dll

2 个答案:

答案 0 :(得分:2)

virtual void destroy() {delete this};
你正在做什么?硅化? 小心!

在您的情况下,MyImplementation::foo()需要有一个正文(即已定义),这就是您收到链接器错误的原因

答案 1 :(得分:1)

似乎您的问题是您没有在链接中包含IInterface.obj文件。在发布模式下,编译器意识到ctor是空的,并删除对它的调用。但它的调试模式(单步执行),ctor必须在那里。我猜你刚刚使用.h文件。