【问题标题】:Unresolved External (abstract class constructor/destructor)未解析的外部(抽象类构造函数/析构函数)
【发布时间】:2009-08-19 17:49:47
【问题描述】:

所以,我有一个抽象类Panel 和它的一个实现MyPanel。它们看起来像这样:

class Panel : public QWidget
{
public:
  Panel(QWidget* parent = 0) = 0;
  virtual ~Panel() = 0;
  // but wait, there's more!!
};

class MyPanel : public Panel
{
public:
  MyPanel(QWidget* parent = 0);
  ~MyPanel() {}; // nothing to do here
};

MyPanel::MyPanel(QWidget* parent) :
  Panel(parent)
{
  // you must construct additional pylons
}

我收到来自 VC++ 的构造函数/析构函数的链接器错误

error LNK2019: unresolved external symbol "public: virtual __thiscall Panel::~Panel(void)" (??1Panel@@UAE@XZ) referenced in function "public: virtual __thiscall MyPanel::~MyPanel(void)" (??1MyPanel@@UAE@XZ)  mypanel.obj
error LNK2019: unresolved external symbol "public: __thiscall Panel::Panel(class QWidget *)" (??0Panel@@QAE@PAVQWidget@@@Z) referenced in function "public: __thiscall MyPanel::MyPanel(class QWidget *)" (??0MyPanel@@QAE@PAVQWidget@@@Z)  mypanel.obj

为什么会出现此链接器错误?


--- 答案---

class Panel : public QWidget
{
public:
  Panel(QWidget* parent = 0) : QWidget(parent) {};
  virtual ~Panel() {};
  // but wait, there's more!!
};

我以为我在午餐前尝试过这个。原来我错了。

【问题讨论】:

  • 您似乎有一些拼写错误。你能澄清一下吗?类声明需要以 ; 结尾例如,类 XXX {};你也有看起来像虚拟构造函数的东西,但这在 C++ 中无效
  • 更正了我的拼写错误并添加了正确的解决方案。
  • 在您的“答案”中,您应该明确指出您所做的更改(基本上通过 {} 提供空实现)。否则,它留给读者作为练习来比较您的代码示例并了解不同之处。

标签: c++ qt linker abstract-class


【解决方案1】:
  1. 没有像虚拟构造函数这样的东西。
  2. 您仍然应该提供析构函数的实现。

【讨论】:

    【解决方案2】:

    纯虚拟析构函数仍然需要实现。

    稍微扩展一下:

    如果子类的任何实例被破坏,则总是会调用类的析构函数,因此它需要有一个实现。 (基本上,使析构函数成为纯虚拟的唯一效果是它可以防止类的实例化)。

    至于构造函数:你把它变成了纯虚拟的(我看不出这样做的任何理由),但是你从子类的构造函数中显式调用它。

    【讨论】:

    • 构造函数在 C++ 中不能是虚拟的。
    猜你喜欢
    • 1970-01-01
    • 2014-04-20
    • 2017-04-01
    • 2014-06-27
    • 2012-12-24
    • 2012-01-20
    • 1970-01-01
    • 1970-01-01
    • 2014-05-27
    相关资源
    最近更新 更多