Wie eine Datenklasse private Variable von einer anderen abgeleiteten Klasse, deren übergeordnete Klasse ist ein Freund der Klasse der Datenklasse zugreifen?

StackOverflow https://stackoverflow.com/questions/851041

Frage

Ich habe drei Klassen:

  1. Ein Datenhalter Klasse CDataHolder, die ein Pimpl Muster verwendet

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

    class CBase: 
    {
    protected:
    CDataHolder::Pimpl* getDataHolderPimpl();
    };
    
  3. Eine abgeleitete Klasse CDerived von CBase, die die gleiche iPimpl Mitglied auch zugreifen müssen. Hier tritt ein Problem auf. Die abgeleitete Klasse kann nicht das iPimpl Mitglied verwenden, obwohl seine Elternklasse ein Freund Klasse. 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, also ist es nicht eine gute Möglichkeit für jede abgeleitete Klasse einen „Freund Klasse CDerivedXXX“ Zeile in CDataHolder Klasse zu setzen. Wie dieses Problem zu überwinden? Gibt es einen besseren Weg, dies zu tun? Vielen Dank im Voraus.

War es hilfreich?

Lösung

Da Sie struct PImpl im privaten Teil der CDataHolder Klasse deklariert haben, nur Freunde von CDataHolder können den gleichen Zugang. Warum Sie keine Vorwärtsdeklaration struct PImpl im öffentlichen Bereich setzen oder besser noch vor der CDataHolder Klasse?

Andere Tipps

Freund ist (zu Recht) sehr begrenzt und nicht vererbt werden kann. Ich hasse es, die Frage zu bitten, aber vielleicht entweder A) Sie den Zugang der Öffentlichkeit zu Pimpl oder einen Aspekt davon benötigen, oder B) benötigen Sie die Dataholder-Klasse etwas mit Pimpl für Sie zu tun.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top