2009-05-12 8 views
2

Ich habe drei Klassen:Wie auf eine private Mitgliedsvariable einer Datenklasse von einer anderen abgeleiteten Klasse zugreifen, deren Elternklasse eine Freundklasse der Datenklasse ist?

  1. Eine Klasse CDataHolder Datenbehälter, die ein Muster Pimpl verwendet

     
    class CDataHolder 
    { 
    public: 
        // ... 
    private: 
    friend class CBase; 
    struct PImpl; 
    PImpl* iPimpl; 
    }; 
    
  2. Eine Basisklasse CBase, die das iPImpl Mitglied in CDataHolder, so dass es zugreifen müssen ist ein Freund Klasse von CDataHolder

     
    class CBase: 
    { 
    protected: 
    CDataHolder::Pimpl* getDataHolderPimpl(); 
    }; 
    
  3. eine abgeleitete Klasse von CBase CDerived, die die sam zugreifen müssen e iPimpl-Mitglied auch. Hier tritt ein Problem auf. Die abgeleitete Klasse kann das iPimpl-Member nicht verwenden, obwohl die Elternklasse eine Friend-Klasse ist. wie folgt aus:

     
    class CDerived : public CBase 
    { 
    public: 
    void doSth() { 
        CDataHolder::Pimpl *pImpl = getDataHolderPimpl(); // this line raises an error: 
                    // "illegal access from CDataHolder to protected/private member CDataHolder::PImpl" 
    } 
    }; 
    

    Es gibt viele abgeleitete Klassen sind, ist es so für jede abgeleitete Klasse einen „Freund Klasse CDerivedXXX“ Zeile in CDataHolder Klasse setzen kein guter Weg. Wie überwinde ich dieses Problem? Gibt es einen besseren Weg, dies zu tun? Danke im Voraus.

Antwort

2

Da Sie struct PImpl im privaten Teil der CDataHolder Klasse deklariert haben, nur Freunde von CDataHolder können den gleichen Zugang. Warum legen Sie keine Forward-Deklaration struct PImpl in den öffentlichen Abschnitt oder noch besser vor der CDataHolder-Klasse?

+0

Vielen Dank und Ihre schnelle Antwort. Es funktioniert, nachdem die "struct Pimpl" -Deklaration öffentlich gemacht wurde. Ich habe die oben angegebene Fehlerinformation falsch verstanden, das heißt, sie kann nicht auf den CDataHolder :: Pimpl-Typ zugreifen. Der Typ benötigt einen öffentlichen Zugriff. Vielen Dank. – douyw

1

Freund ist (zu Recht) sehr begrenzt und kann nicht vererbt werden. Ich hasse es, die Frage zu stellen, aber vielleicht brauchen Sie entweder A) öffentlichen Zugang zu PImpl oder irgendeinen Aspekt davon, oder B) Sie brauchen die DataHolder-Klasse, um etwas mit PImpl für Sie zu tun.

Verwandte Themen