【问题标题】:Using an interface from another project in VS2012在 VS2012 中使用另一个项目的接口
【发布时间】:2013-06-16 21:24:47
【问题描述】:

我目前正在尝试从这样定义的 c++ 接口继承:

class IWindow: public Initializable
{
public:
    virtual ~IWindow(void) =0;

    virtual BOOL IsVisible(void) =0;
    virtual void Show(BOOL inbShow) =0;
};

这个接口是在一个独立的项目中定义的,与试图从它继承的类不同。该类是这样定义的:

#include "IWindow.h"

class Win32Window: public IWindow
{
    HGLRC m_renderingContext;
    HWND m_win32Handle;
    HDC m_deviceContext;

    BOOL m_bVisible;
public:
    Win32Window(void);
    virtual ~Win32Window(void);

    virtual void Initialize(void);
    virtual void Destroy(void);

    virtual BOOL IsVisible(void);
    virtual void Show(BOOL inbShow);
};

我在 IWindow 的公开定义的纯虚拟构造函数上遇到了一个外部符号问题,确切的错误消息如下:

1>Win32Window.obj:错误 LNK2019:无法解析的外部符号“public: virtual __thiscall IWindow::~IWindow(void)”(??1IWindow@@UAE@XZ) 在函数“public: virtual __thiscall Win32Window:: ~Win32Window(void)" (??1Win32Window@@UAE@XZ)

我似乎无法理解为什么会发生这个错误,只要我知道一个类是否在另一个项目中应该无关紧要,只要文件被#included 到继承类的头文件中。谁能向我解释这个错误并可能提供解决这个错误的方法?我最终计划将 IWindow 类作为 dll 的一部分,但在那之前我需要能够使用多个不同项目中的文件来编译和测试这个解决方案。

【问题讨论】:

  • 你在IWindow中实现析构函数了吗?

标签: c++ linker


【解决方案1】:

您收到关于未定义的纯虚拟析构函数的错误消息。

析构函数,即使它是纯虚拟的,也必须有一个实现。最有可能的 .cpp 文件与 IWindow::~IWindow() 的实现不包含在项目中。这就是链接器找不到它的原因。

【讨论】:

  • 所以即使它是纯虚拟的,它仍然需要实现吗?这是纯虚拟析构函数特有的吗?
  • 是的,它特定于析构函数。析构函数总是被调用,即使它是纯虚拟的。如果实例化具有纯虚析构函数的类对象或其任何派生类,则必须定义析构函数,否则无法销毁该对象。您可以通过搜索“纯虚拟析构函数”找到有关该主题的大量讨论。
  • @juanchopanza 在析构函数的情况下,在派生类中实现是不够的。
  • @juanchopanza 它在标准中定义。见stackoverflow.com/questions/630950/pure-virtual-destructor-in-c的第二条评论
  • 啊,是的,我都忘记了。感谢您的链接。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-21
  • 2020-03-14
  • 1970-01-01
  • 1970-01-01
  • 2015-04-12
  • 1970-01-01
相关资源
最近更新 更多