Неопределенная ссылка на vtable

При создании моей программы C++ я получаю сообщение об ошибке

неопределенная ссылка на 'vtable...

Какова причина этой проблемы? Как я фиксирую его?


Это так происходит, что я получаю ошибку для следующего кода (Рассматриваемым классом является CGameModule.) и я не могу ни за что в жизни понять, какова проблема. Сначала, я думал, что это было связано с упущением дать виртуальной функции тело, но насколько я понимаю, все - все здесь. Цепочка наследования немного длинна, но здесь является связанным исходным кодом. Я не уверен, что другую информацию я должен обеспечить.

Примечание: Конструктор - то, где эта ошибка происходит, это казалось бы.

Мой код:

class CGameModule : public CDasherModule {
 public:
  CGameModule(Dasher::CEventHandler *pEventHandler, CSettingsStore *pSettingsStore, CDasherInterfaceBase *pInterface, ModuleID_t iID, const char *szName)
  : CDasherModule(pEventHandler, pSettingsStore, iID, 0, szName)
  { 
      g_pLogger->Log("Inside game module constructor");   
      m_pInterface = pInterface; 
  }

  virtual ~CGameModule() {};

  std::string GetTypedTarget();

  std::string GetUntypedTarget();

  bool DecorateView(CDasherView *pView) {
      //g_pLogger->Log("Decorating the view");
      return false;
  }

  void SetDasherModel(CDasherModel *pModel) { m_pModel = pModel; }


  virtual void HandleEvent(Dasher::CEvent *pEvent); 

 private:



  CDasherNode *pLastTypedNode;


  CDasherNode *pNextTargetNode;


  std::string m_sTargetString;


  size_t m_stCurrentStringPos;


  CDasherModel *m_pModel;


  CDasherInterfaceBase *m_pInterface;
};

Наследовался...

class CDasherModule;
typedef std::vector<CDasherModule*>::size_type ModuleID_t;

/// \ingroup Core
/// @{
class CDasherModule : public Dasher::CDasherComponent {
 public:
  CDasherModule(Dasher::CEventHandler * pEventHandler, CSettingsStore * pSettingsStore, ModuleID_t iID, int iType, const char *szName);

  virtual ModuleID_t GetID();
  virtual void SetID(ModuleID_t);
  virtual int GetType();
  virtual const char *GetName();

  virtual bool GetSettings(SModuleSettings **pSettings, int *iCount) {
    return false;
  };

 private:
  ModuleID_t m_iID;
  int m_iType;
  const char *m_szName;
};

Который наследовался....

namespace Dasher {
  class CEvent;
  class CEventHandler;
  class CDasherComponent;
};

/// \ingroup Core
/// @{
class Dasher::CDasherComponent {
 public:
  CDasherComponent(Dasher::CEventHandler* pEventHandler, CSettingsStore* pSettingsStore);
  virtual ~CDasherComponent();

  void InsertEvent(Dasher::CEvent * pEvent);
  virtual void HandleEvent(Dasher::CEvent * pEvent) {};

  bool GetBoolParameter(int iParameter) const;
  void SetBoolParameter(int iParameter, bool bValue) const;

  long GetLongParameter(int iParameter) const;
  void SetLongParameter(int iParameter, long lValue) const;

  std::string GetStringParameter(int iParameter) const;
  void        SetStringParameter(int iParameter, const std::string & sValue) const;

  ParameterType   GetParameterType(int iParameter) const;
  std::string     GetParameterName(int iParameter) const;

 protected:
  Dasher::CEventHandler *m_pEventHandler;
  CSettingsStore *m_pSettingsStore;
};
/// @}


#endif
313
задан Raedwald 19 June 2019 в 02:30
поделиться

3 ответа

Итак, я выяснил, в чем проблема, и это была комбинация плохой логики и незнания полностью мира automake / autotools. Я добавлял правильные файлы в свой шаблон Makefile.am, но я не был уверен, на каком этапе нашего процесса сборки фактически был создан сам make-файл. Итак, я компилировал старый make-файл, который вообще ничего не знал о моих новых файлах.

Спасибо за ответы и ссылку на FAQ GCC. Я обязательно прочитаю это, чтобы избежать возникновения этой проблемы по реальной причине.

52
ответ дан 23 November 2019 в 01:08
поделиться
  • Вы уверены, что CDasherComponent имеет тело для деструктора? Его здесь точно нет - вопрос в том, есть ли это в файле .cc.
  • С точки зрения стиля, CDasherModule должен явно определять свой деструктор virtual .
  • Похоже, что CGameModule имеет дополнительный } в конце (после }; // для класса ).
  • Связывается ли CGameModule с библиотеками, которые определяют CDasherModule и CDasherComponent ?
7
ответ дан 23 November 2019 в 01:08
поделиться

В GCC FAQ есть запись об этом:

Решение состоит в том, чтобы обеспечить определение всех виртуальных методов, которые не являются чистыми. Обратите внимание, что деструктор должен быть определен, даже если он объявлен чисто виртуальным [class.dtor]/7.

385
ответ дан 23 November 2019 в 01:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: