Når jeg bygger mit C++ program, får jeg fejlmeddelelsen
undefined reference to 'vtable...
Hvad er årsagen til dette problem? Hvordan kan jeg løse det?
Det er sådan at jeg får fejlen for følgende kode (Den pågældende klasse er CGameModule.) og jeg kan ikke for mit liv forstå hvad problemet er. Først troede jeg at det var relateret til at man glemte at give en virtuel funktion en body, men så vidt jeg forstår, er alting her. Arvekæden er lidt lang, men her er den tilhørende kildekode. Jeg er ikke sikker på hvilke andre oplysninger jeg skal give.
Note: Det er i konstruktøren, at fejlen opstår, ser det ud 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 har et afsnit om det:
Løsningen er at sikre, at alle virtuelle metoder, der ikke er rene, er defineret. Bemærk, at en destruktor skal defineres, selv om den er erklæret ren-virtuel [class.dtor]/7.
Så, I've regnet ud problemet, og det var en kombination af dårlig logik og ikke at være helt fortrolig med automake/autotools verden. Jeg tilføjede de korrekte filer til min Makefile.am-skabelon, men jeg var ikke sikker på, hvilket trin i vores byggeproces der faktisk skabte selve makefilen. Så jeg kompilerede med en gammel makefile, der ikke havde nogen som helst idé om mine nye filer.
Tak for svarene og linket til GCC FAQ. Jeg vil sørge for at læse det for at undgå, at dette problem opstår af en reel grund.
CDasherComponent
har et organ til destruktoren? Det er det bestemt ikke her - spørgsmålet er, om det er i .cc-filen.CDasherModule
eksplicit definere sin destructor virtual
.CGameModule
har en ekstra }
i slutningen (efter }; // for klassen
).CGameModule
linket mod de biblioteker, der definerer CDasherModule
og CDasherComponent
?