Fichier A.h
#ifndef A_H_
#define A_H_
class A {
public:
virtual ~A();
virtual void doWork();
};
#endif
Fichier Child.h
#ifndef CHILD_H_
#define CHILD_H_
#include "A.h"
class Child: public A {
private:
int x,y;
public:
Child();
~Child();
void doWork();
};
#endif
Et Child.cpp
#include "Child.h"
Child::Child(){
x = 5;
}
Child::~Child(){...}
void Child::doWork(){...};
Le compilateur dit qu'il existe une référence non définie à vtable pour A
. J'ai essayé beaucoup de choses différentes, mais aucune n'a fonctionné.
Mon objectif est que la classe A
soit une interface et sépare le code d'implémentation des en-têtes.
Pourquoi l'erreur et comment la résoudre?
Vous devez fournir définitions pour toutes les fonctions virtuelles dans class A
. Seules les fonctions virtuelles pures sont autorisées à ne pas avoir de définitions.
i.e: Dans class A
les deux méthodes:
virtual ~A();
virtual void doWork();
devrait être défini (devrait avoir un corps)
par exemple.:
A.cpp
void A::doWork()
{
}
A::~A()
{
}
Caveat:
Si vous voulez que votre class A
agisse comme une interface (a.k.a Classe abstraite en C++), vous devez alors rendre la méthode pure virtuelle.
virtual void doWork() = 0;
Bonne lecture:
Qu'est-ce que cela signifie que la "table virtuelle" est un externe non résolu?
Lors de la construction de C++, l'éditeur de liens indique que mes constructeurs, destructeurs ou tables virtuelles ne sont pas définis.
Dans ce cas, faites en sorte que le membre fonctionne comme pur virtuel dans la classe A.
Extrait de code.
class A {
// ...
virtual void doWork() = 0;
};
Assurez-vous de supprimer tous les fichiers "* .gch" si aucune des autres réponses ne vous aide.