2010-05-21 14 views
1

Il est tard dans la nuit ici et je deviens fou en essayant de résoudre une erreur de l'éditeur de liens.Symbole non résolu lors de l'héritage de l'interface

Si je l'interface abstraite suivante:

class IArpPacketBuilder 
{ 
public: 

    IArpPacketBuilder(const DslPortId& aPortId); 
    virtual ~IArpPacketBuilder(); 

    // Other abstract (pure virtual methods) here... 
}; 

et j'instancier comme ceci:

class DummyArpPacketBuilder 
    : public IArpPacketBuilder 
{ 

public: 

    DummyArpPacketBuilder(const DslPortId& aPortId) 
     : IArpPacketBuilder(aPortId) {} 
    ~DummyArpPacketBuilder() {} 
}; 

pourquoi j'obtiens l'erreur suivante lors de la liaison?

Unresolved symbol references: 

IArpPacketBuilder::IArpPacketBuilder(DslPortId const&): 
    ppc603_vxworks/_arpPacketQueue.o 
IArpPacketBuilder::~IArpPacketBuilder(): 
    ppc603_vxworks/_arpPacketQueue.o 
typeinfo for IArpPacketBuilder: 
    ppc603_vxworks/_arpPacketQueue.o 
*** Error code 1 

IArpPacketBuilder est une interface abstraite, donc tant que je les constructeurs et définis dans l'interface destruction du béton (dérivée), je devrais être bien, non? Eh bien, il ne semble pas.

Répondre

5

Vous avez seulement déclaré le constructeur et destructor de IArpPacketBuilder, non défini eux. L'éditeur de liens a également besoin des définitions. Notez que C++ n'a aucun concept de interface abstraite - IArpPacketBuilder est une classe ancienne qui contient des méthodes virtuelles pures, ce qui rend son instanciation directe impossible.

Ainsi, la solution la plus simple pour fournir des implémentations inline:

class IArpPacketBuilder 
{ 
public: 

    IArpPacketBuilder(const DslPortId& aPortId) {} 
    virtual ~IArpPacketBuilder() {} 

    // Other abstract (pure virtual methods) here... 
}; 

Vous pouvez faire la destructor virtuelle pure, mais tout de même, vous encore besoin de fournir une définition pour elle, par exemple

class IArpPacketBuilder 
{ 
public: 

    IArpPacketBuilder(const DslPortId& aPortId) {} 
    virtual ~IArpPacketBuilder() = 0; 

    // Other abstract (pure virtual methods) here... 
}; 

IArpPacketBuilder::~IArpPacketBuilder() {} 
+0

J'ai pu hériter de cette interface dans une autre bibliothèque sans aucun problème, donc je ne pensais pas que ce serait un problème. Ai-je besoin de les définir dans une interface abstraite? – LeopardSkinPillBoxHat

+0

@Leopard, intéressant. Je pensais que cela ne fonctionnerait pas de cette façon - si vous déclarez explicitement un constructeur/destructeur, le compilateur ne le générera pas automatiquement pour vous. Notez que C++ n'a pas de concept de _abstract interface_ - votre classe est une classe ordinaire avec quelques méthodes virtuelles pures, ce qui rend son instanciation directe impossible. –

+0

Merci, je l'ai eu en travaillant en définissant les corps du ctor et du dtor, mais je n'arrive toujours pas à comprendre pourquoi cela a fonctionné dans une autre bibliothèque alors que je n'avais pas défini le ctor et le dtor. – LeopardSkinPillBoxHat

1

essayez de les inline - fonctionne pour moi, bien que je ne sais pas si elle est bonne solution

+0

vous voulez fournir des implémentations en ligne dans IArpPacketBuilder? – LeopardSkinPillBoxHat

+1

oui, de la même manière que Peter a répondu – XAder

2

Vous devez fournir des définitions - à savoir les organismes de code pour le constructeur et destructor pour la classe d'interface abstraite - les deux fonctions seront utilisées dans votre code, même si la classe est abstraite. Une classe abstraite n'est pas une classe qui n'est jamais instanciée - c'est une classe qui n'est jamais directement instanciée par l'utilisateur. Il sera cependant instancié par le compilateur, qui a besoin du constructeur et du destructeur à définir.