Udefinert referanse til vtable

Når jeg bygger C++-programmet mitt, får jeg feilmeldingen

udefinert referanse til 'vtable...

Hva er årsaken til dette problemet? Hvordan fikser jeg det?


Det skjer slik at jeg får feilen for følgende kode (Den aktuelle klassen er CGameModule.) og jeg kan ikke for livet av meg forstå hva problemet er. Først trodde jeg det var relatert til å glemme å gi en virtuell funksjon en kropp, men så vidt jeg forstår er alt her. Arvkjeden er litt lang, men her er den relaterte kildekoden. Jeg er ikke sikker på hvilken annen informasjon jeg skal gi.

Merk: Konstruktøren er der denne feilen skjer, ser det ut til.

Min kode:

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;
};

Arver fra...

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;
};

Som arver fra....

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

GCC FAQ]1 har en oppføring om dette:

Løsningen er å sikre at alle virtuelle metoder som ikke er rene er definert. Merk at en destruktor må defineres selv om den er deklarert som ren-virtuell [class.dtor]/7.

Kommentarer (9)
Løsning

Så jeg har funnet ut problemet, og det var en kombinasjon av dårlig logikk og ikke å være helt kjent med automake / autotools-verdenen. Jeg la til de riktige filene i Makefile.am-malen min, men jeg var ikke sikker på hvilket trinn i byggeprosessen vår som faktisk opprettet selve makefilen. Så jeg kompilerte med en gammel makefile som ikke hadde noen anelse om de nye filene mine overhodet.

Takk for svarene og lenken til GCC FAQ. Jeg vil være sikker på å lese det for å unngå at dette problemet oppstår av en reell grunn.

Kommentarer (7)
  • Er du sikker på at CDasherComponent har en kropp for destruktoren? Det er definitivt ikke her - spørsmålet er om det er i .cc-filen.
  • Fra et stilperspektiv bør CDasherModule eksplisitt definere destruktoren virtual.
  • Det ser ut som CGameModule har en ekstra } på slutten (etter }; // for klassen).
  • Er CGameModule koblet mot bibliotekene som definerer CDasherModule og CDasherComponent?
Kommentarer (2)