Bij het bouwen van mijn C++ programma, krijg ik de foutmelding
ongedefinieerde verwijzing naar 'vtable...
Wat is de oorzaak van dit probleem? Hoe kan ik het oplossen?
Het toeval wil dat ik de fout krijg bij de volgende code (De klasse in kwestie is CGameModule.) en ik kan voor het leven van mij niet begrijpen wat het probleem is. Eerst dacht ik dat het te maken had met het vergeten een virtuele functie een body te geven, maar voor zover ik het begrijp is alles hier in orde. De overervingsketen is een beetje lang, maar hier is de bijbehorende broncode. Ik'weet niet zeker welke andere informatie ik moet geven.
Opmerking: De constructor is waar deze fout zich voordoet, zo lijkt het'd.
Mijn code:
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;
};
Erft van...
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;
};
Die erft van....
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
De GCC FAQ heeft er een item over:
De oplossing is om ervoor te zorgen dat alle virtuele methoden die niet puur zijn, gedefinieerd worden. Merk op dat een destructor moet worden gedefinieerd, zelfs als deze als puur-virtueel wordt gedeclareerd [class.dtor]/7.
Dus, ik'heb het probleem uitgezocht en het was een combinatie van slechte logica en niet helemaal vertrouwd zijn met de automake/autotools wereld. Ik voegde de juiste bestanden toe aan mijn Makefile.am sjabloon, maar ik was niet zeker welke stap in ons bouwproces eigenlijk het makefile zelf maakte. Dus, ik was aan het compileren met een oud makefile dat geen enkel idee had van mijn nieuwe bestanden.
Bedankt voor de antwoorden en de link naar de GCC FAQ. Ik zal die zeker lezen om te voorkomen dat dit probleem zich voordoet met een echte reden.
CDasherComponent
een body heeft voor de destructor? Het'is zeker niet hier - de vraag is of het in het .cc bestand staat.CDasherModule
expliciet zijn destructor virtual
moeten definiëren.CGameModule
een extra }
aan het eind heeft (na de }; // voor de class
).CGameModule
gekoppeld aan de bibliotheken die CDasherModule
en CDasherComponent
definiëren?