2010-03-17 14 views
5

pour une raison quelconque, je pense à l'implémentation de l'interface dans une certaine fonction (méthode) en tant que classe locale.Implémenter une classe abstraite en tant que classe locale? avantages et inconvénients

Considérez ce qui suit:

class A{ 
public: 

    virtual void MethodToOverride() = 0; 

}; 

A * GetPtrToAImplementation(){ 

    class B : public A { 
    public: 
     B(){} 
     ~B(){} 

     void MethodToOverride() { 
      //do something 
     } 
    }; 

    return static_cast<A *>(new B()); 
} 


int _tmain(int argc, _TCHAR* argv[]) 
{ 

    A * aInst = GetPtrToAImplementation(); 

    aInst->MethodToOverride(); 

    delete aInst; 
    return 0; 
} 

les raisons pour lesquelles je fais ça:

  1. Je suis paresseux pour mettre en œuvre la classe (B) dans des fichiers séparés
  2. MethodToOverride seulement les délégués appellent vers une autre classe
  3. La classe B ne doit pas être visible par les autres utilisateurs
  4. pas besoin de s'inquiéter ab en supprimant aInst puisque les pointeurs intelligents sont utilisés dans la mise en œuvre réelle

Donc, ma question est de savoir si je fais ça correctement?

Merci d'avance!

+0

Pourquoi ne pouvez-vous pas définir complètement 'B' (non local) dans le fichier d'implémentation de' A'? –

+1

Juste un nitpick, mais A devrait avoir un destructeur virtuel – jpalecek

+0

A est juste une interface - déclarée dans un fichier d'en-tête. De plus, B ne peut pas être visible en dehors de l'unité de traduction où GetPtrToAImplementation est défini. – sinek

Répondre

5
  1. Vous pouvez définir B dans l'espace de noms sans nom du fichier de mise en œuvre où vous implémentez GetPtrToAImplementation().

  2. A doit avoir un dteur virtuel. Par la norme C++ actuelle, vous ne pouvez pas utiliser les classes locales comme arguments de gabarit. (Ce qui signifie que vous ne pouvez pas les utiliser avec la STL, par exemple.)

+0

@sbi: il semble qu'il est temps pour moi de me reposer car je ne pouvais pas me souvenir d'espaces de noms sans nom :) p.s. merci pour l'info qu'ils ne peuvent pas être utilisés comme arguments de modèle puisque je ne le savais pas! – sinek