Kurdamas savo C++ programą, gaunu klaidos pranešimą
neapibrėžta nuoroda į 'vtable...
Kokia šios problemos priežastis? Kaip ją ištaisyti?
Taip jau atsitiko, kad aš gaunu klaidą dėl toliau nurodyto kodo (atitinkama klasė yra CGameModule.) ir aš negaliu suprasti, kokia tai problema. Iš pradžių maniau, kad tai susiję su tuo, jog pamiršau virtualiai funkcijai suteikti kūną, bet, kiek suprantu, viskas čia yra gerai. Paveldėjimo grandinė yra šiek tiek ilga, bet štai susijęs išeities kodas. Nežinau, kokią dar informaciją turėčiau pateikti.
Pastaba: atrodo, kad konstruktorius yra ta vieta, kur įvyksta ši klaida.
Mano kodas:
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;
};
Paveldi iš...
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;
};
Kuris paveldi iš....
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
Apie tai rašoma GCC DUK:
Sprendimas - užtikrinti, kad būtų apibrėžti visi virtualūs metodai, kurie nėra gryni. Atkreipkite dėmesį, kad destruktorius turi būti apibrėžtas, net jei jis deklaruotas kaip grynasis virtualusis [class.dtor]/7.
Taip, Aš išsiaiškinau problemą ir tai buvo blogos logikos ir ne visiškai susipažinęs su Automake/autotools pasaulyje derinys. Į Makefile.am šabloną pridėjau tinkamus failus, bet nebuvau tikras, kuris mūsų kūrimo proceso etapas iš tikrųjų sukūrė patį Makefile failą. Taigi, kompiliavau naudodamas seną makefile failą, kuris neturėjo jokio supratimo apie mano naujus failus.
Ačiū už atsakymus ir nuorodą į GCC DUK. Būtinai perskaitysiu, kad išvengčiau šios problemos atsiradimo dėl tikros priežasties.
CDasherComponent
turi destruktoriaus kūną? Jo čia tikrai nėra - klausimas, ar jis yra .cc faile.CDasherModule
turėtų aiškiai apibrėžti savo destruktorių virtual
.CGameModule
turi papildomą }
pabaigoje (po }; // klasės
).CGameModule
susiejama su bibliotekomis, kurios apibrėžia CDasherModule
ir CDasherComponent
?