Pri zostavovaní programu v jazyku C++ dostávam chybovú správu
nedefinovaný odkaz na 'vtable...
Čo je príčinou tohto problému? Ako ho môžem odstrániť?
Stáva sa mi, že dostávam chybu pri nasledujúcom kóde (Ide o triedu CGameModule.) a za žiadnu cenu nemôžem pochopiť, v čom je problém. Najprv som si myslel, že to súvisí so zabudnutím dať virtuálnej funkcii telo, ale pokiaľ som to pochopil, všetko je tu. Reťazec dedenia je trochu dlhý, ale tu je súvisiaci zdrojový kód. Nie'som si istý, aké ďalšie informácie by som mal poskytnúť.
Poznámka: Zdá sa, že práve v konštruktore dochádza k tejto chybe.
Môj kód:
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;
};
Dedí od...
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;
};
Ktorý dedí od....
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
V GCC FAQ je o tom záznam:
Riešením je zabezpečiť, aby boli definované všetky virtuálne metódy, ktoré nie sú čisté. Všimnite si, že deštruktor musí byť definovaný, aj keď je deklarovaný ako čisto virtuálny [class.dtor]/7.
Tak som prišiel na problém a bola to kombinácia zlej logiky a toho, že nie som úplne oboznámený so svetom automake/autotools. Do šablóny Makefile.am som pridával správne súbory, ale nebol'som si istý, ktorý krok v našom procese zostavovania vlastne vytvoril samotný súbor makefile. Takže som kompiloval so starým súborom makefile, ktorý vôbec netušil o mojich nových súboroch.
Ďakujem za odpovede a odkaz na FAQ GCC. Určite si to prečítam, aby som sa vyhol výskytu tohto problému z reálneho dôvodu.
CDasherComponent
má telo pre deštruktor? Tu určite nie je - otázka je, či je v súbore .cc.CDasherModule
explicitne definovať svoj deštruktor virtual
.CGameModule
má na konci navyše }
(po }; // pre triedu
).CGameModule
linkovaný oproti knižniciam, ktoré definujú CDasherModule
a CDasherComponent
?