C++ programımı oluştururken şu hata mesajını alıyorum
'vtable...'a tanımlanmamış referans
Bu sorunun nedeni nedir? Nasıl düzeltebilirim?
Öyle ki aşağıdaki kod için hata alıyorum (Söz konusu sınıf CGameModule.) ve sorunun ne olduğunu bir türlü anlayamıyorum. İlk başta, sanal bir fonksiyona bir gövde vermeyi unutmakla ilgili olduğunu düşündüm, ancak anladığım kadarıyla her şey burada. Kalıtım zinciri biraz uzun, ancak ilgili kaynak kodu burada. Başka hangi bilgileri vermem gerektiğinden emin değilim.
Not: Görünüşe göre bu hatanın meydana geldiği yer kurucudur.
Benim kodum:
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;
};
Şuradan miras...
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;
};
Hangi miras....
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 SSS]1'de bu konuda bir giriş bulunmaktadır:
Çözüm, saf olmayan tüm sanal yöntemlerin tanımlandığından emin olmaktır. Saf-sanal olarak bildirilmiş olsa bile bir yıkıcının tanımlanması gerektiğini unutmayın [class.dtor]/7.
Bu yüzden, sorunu çözdüm ve bunun kötü mantık ve automake/autotools dünyasına tamamen aşina olmamanın bir kombinasyonu olduğunu anladım. Makefile.am şablonuma doğru dosyaları ekliyordum, ancak derleme sürecimizdeki hangi adımın aslında makefile'ın kendisini oluşturduğundan emin değildim. Bu yüzden, yeni dosyalarım hakkında hiçbir fikri olmayan eski bir makefile ile derleme yapıyordum.
Yanıtlar ve GCC SSS bağlantısı için teşekkürler. Bu sorunun gerçek bir nedenle ortaya çıkmasını önlemek için bunu okuduğumdan emin olacağım.
CDasherModule
yıkıcısını açıkça virtual
olarak tanımlamalıdır.CGameModule
dosyasının sonunda fazladan bir }
var (sınıf için `}; // ifadesinden sonra).,
CDasherModuleve
CDasherComponent` tanımlayan kütüphanelere mi bağlanıyor?