Unresolved External (абстрактный конструктор / деструктор) - PullRequest
7 голосов
/ 19 августа 2009

Итак, у меня есть абстрактный класс 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!!
};

Я думал, что попробовал это до обеда. Оказывается, я был неправ.

Ответы [ 2 ]

6 голосов
/ 19 августа 2009
  1. нет такой вещи, как виртуальный конструктор.
  2. Вы все еще должны предоставить реализацию деструктора.
3 голосов
/ 19 августа 2009

Чисто виртуальные деструкторы все еще должны иметь реализацию.

Подробнее об этом:

Деструктор класса всегда будет вызываться, если какой-либо экземпляр подкласса будет разрушен, поэтому он должен иметь реализацию. (По сути, единственный эффект превращения деструктора в чисто виртуальный состоит в том, что он предотвращает создание экземпляров класса).

Что касается конструктора: вы делаете его чисто виртуальным (что я не вижу смысла делать), но затем вы явно вызываете его из конструктора подкласса.

...