我正在努力实现类似于解释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
答案 0 :(得分:2)
virtual void destroy() {delete this};
你正在做什么?硅化?
小心!
在您的情况下,MyImplementation::foo()
需要有一个正文(即已定义),这就是您收到链接器错误的原因
答案 1 :(得分:1)
似乎您的问题是您没有在链接中包含IInterface.obj文件。在发布模式下,编译器意识到ctor是空的,并删除对它的调用。但它的调试模式(单步执行),ctor必须在那里。我猜你刚刚使用.h文件。