Lors de la construction de mon programme C++, j'obtiens le message d'erreur suivant
référence indéfinie à 'vtable...
Quelle est la cause de ce problème ? Comment puis-je le résoudre ?
Il se trouve que j'obtiens l'erreur pour le code suivant (la classe en question est CGameModule.) et je n'arrive pas à comprendre quel est le problème. Au début, je pensais que c'était lié à l'oubli de donner un corps à une fonction virtuelle, mais d'après ce que je comprends, tout est là. La chaîne d'héritage est un peu longue, mais voici le code source correspondant. Je ne suis pas sûr des autres informations que je devrais fournir.
Note : Le constructeur est l'endroit où l'erreur se produit, il semblerait.
Mon 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;
};
Hérite de...
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;
};
Qui hérite de....
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
4 votes
J'ai complètement oublié que le message d'erreur spécifie une fonction. Il s'agit du constructeur, donc j'ai vu le nom de ma classe et je n'ai pas fait le lien. Donc, c'est le constructeur qui lance ce message. Je vais ajouter ce détail à mon message original.
4 votes
Si vous n'avez pas reconstruit les fichiers de votre projet après avoir effectué des modifications importantes (par ex.
qmake -project
et ensuiteqmake
) pour générer un nouveauMakefile
qui est une source probable d'erreur lors de l'utilisation de Qt.4 votes
@DavidC.Rankin, un autre problème lié à Qt est que si le fichier avec
Q_OBJECT
est copié en externe, mais ne fait pas encore partie du fichier .pro, alors bien qu'il compile bien, il ne se lie pas. Nous devons ajouter ce.h/.cpp
dans le fichier .pro pour être en mesure deqmake
.