2016-02-14 1 views
0

j'ai interface simple générale qui ressemble à ceci:C++ objet passant qui en utilisant le type abstrait de classe donne l'erreur: n'est pas membre de GeneralDriverInterface

Class GeneralDriverInterface 
{ 
public: 
virtual void Init() = 0; 
}; 

Alors j'ai la classe qui utilise l'une des sous-classe initialisant l'interface GeneralDriverInterface.

class DriverTest : public GeneralDriverInterface 
    { 
     public: 
     DriverTest(); 
     virtual void Init(); 
     bool TestMe(); 

    } 

    void DriverTest::Init() 
    { 
     //init driver stuff 
    } 

    bool DriverTest::TestMe() 
    { 
     //test driver stuff 
    } 

maintenant pour utiliser cette classe DriverTest il initialisées en classe via la fonction

// in the Processing.h header there is : 

    GeneralDriverInterface* m_GeneralDriverInterface; 
    void Processing::InitDriver(GeneralDriverInterface* _GeneralDriverInterface) 
    { 
     m_GeneralDriverInterface = _GeneralDriverInterface; 
     m_GeneralDriverInterface->Init(); 
     m_GeneralDriverInterface->TestMe(); // The problematic call !! where it failed in compilation 
    } 

Il obtient sa classe de pilote via un constructeur de la classe GeneralFactory comme ceci:

GeneralFactory::SetProcessingDriver() 
{ 
    GeneralDriverInterface pGeneralDriverInterface = new DriverTest() 
    m_pProcessing->InitDriver(pGeneralDriverInterface); 
} 

ok j'ai essayé utiliser l'interface abstraite pour être aussi général que possible, mais obtenir:

error C2039: 'TestMe' : is not a member of 'GeneralDriverInterface' 
1>  g:\project\GeneralDriverInterface.h(6) : see declaration of 'GeneralDriverInterface' 

Ma question est-ce que je dois inclure toutes les fonctions que je vais utiliser dans la classe implémentée?

+0

Vous attendez-vous à ce qu'une classe de base ajoute magiquement tous les membres de toutes ses classes dérivées à sa propre interface? – juanchopanza

+1

Oui, vous avez besoin de toutes les fonctions que vous utilisez via l'interface de l'interface. –

Répondre

0

my question is do i need to include all the functions im going to use in the implemented class's ?

Oui, vous devez inclure toutes les fonctions dont vous avez besoin pour utilisation via le pointeur d'interface ou référence.

Toutes les autres fonctions implémentées dans les classes dérivant l'interface n'ont pas besoin d'être déclarées ici.

Vous pouvez toujours utiliser dynamic_cast<> ou static_cast<> pour obtenir un pointeur ou une référence de la classe d'implémentation.

+0

Eh bien c'est ce que je veux avoir des méthodes très générales dans l'interface mais la sous-classe qui implémentent l'interface aura ses propres méthodes publiques – user63898

+0

@ user63898 Ils peuvent avoir des fonctions publiques de leur propre, vous ne pouvez pas accéder à ces via l'interface sauf si vous faites un casting. –

0

m_GeneralDriverInterface est de type GeneralDriverInterface. La classe GeneralDriverInterface ne possède pas de méthode TestMe().

do i need to include all the functions im going to use in the implemented class's ?

Oui, oui, oui.

Comment le compilateur est censé savoir quel type de méthode il devrait appeler?

+0

M. Bates, je veux utiliser les interfaces comme type général, mais chaque classe qui implémente l'interface aura aussi ses propres fonctions – user63898

+0

@ user63898 Vous devez aussi spécifier les autres méthodes pure virtual dans votre classe de base (ou virtuelle et ne les implémenter que dans leurs classes respectives) ou si vous êtes sûr d'avoir affaire à un objet d'un certain type, vous pouvez 'dynamic_cast' le pointeur et ensuite appeler la méthode appropriée. –