Pimpl idiom mit Vererbung

Möchte ich pimpl-idiom mit Vererbung.

Hier ist die base public-Klasse und deren Implementierung-Klasse:

class A
{
    public:
      A(){pAImpl = new AImpl;};
      void foo(){pAImpl->foo();};
    private:
      AImpl* pAImpl;  
};
class AImpl
{
    public:
      void foo(){/*do something*/};
};

Und ich möchte in der Lage sein, erstellen Sie die abgeleitete öffentliche Klasse mit der Implementierung der Klasse:

class B : public A
{
    public:
      void bar(){pAImpl->bar();};    //Can't do! pAimpl is A's private.
};        

class BImpl : public AImpl
{
    public:
      void bar(){/*do something else*/};
};

Aber ich kann nicht mit pAimpl in B, weil es ist Eine private.

So, ich sehe einige Möglichkeiten, es zu lösen:

  1. Erstellen BImpl* pBImpl Mitglied in B, und übergeben es an Eine mit zusätzlichen Konstruktor, Eine(AImpl*).
  2. Ändern pAImpl geschützt werden (oder fügen Sie eine Get-Funktion), und verwenden Sie es in B.
  3. B sollte nicht die Erben von A. Erstellen BImpl* pBImpl Mitglied in B, und erstellen foo() und bar() in B, die pBImpl.
  4. Andere Weise?

Was soll ich wählen?

InformationsquelleAutor Igor Oks | 2009-01-29
Schreibe einen Kommentar