C ++ 11 Fabrik als Freund der Basisklasse deklarieren

8

Ich versuche eine Factory für abgeleitete Klassen zu erstellen. Ich möchte nur, dass die Factory Instanzen der abgeleiteten Klassen erstellen kann, also habe ich den Basiskonstruktor protected ; Die abgeleiteten Klassen verwenden nur die Basisklassenkonstruktoren, so dass ihre Konstruktoren auch protected sind.

Ich habe versucht, die Factory als Freund der Basisklasse zu deklarieren, damit sie auf den Konstruktor protected zugreifen kann. Wenn ich mit diesem Befehl kompiliere

%Vor%

Ich bekomme diesen Fehler:

%Vor%

Zusammen mit einem ähnlichen Fehler für die abgeleitete Klasse B .

Ich habe das Gefühl, andere Fragen auf stackoverflow.com zu lesen, dass das in C ++ 11 nicht möglich ist, aber ich bin mir nicht sicher warum. Kann jemand erklären, warum das nicht funktioniert und vielleicht eine Alternative?

Beispielcode

%Vor%     
jlconlin 03.06.2014, 11:39
quelle

3 Antworten

5

Wenn Sie einen Konstruktor von einer Basisklasse erben, behält er den Zugriff des ursprünglichen Konstruktors bei, unabhängig davon, wo Sie die Deklaration using in der abgeleiteten Klasse platzieren.

Von §12.9 / 4 [class.inhctor]

  

Ein so deklarierter Konstruktor hat den gleichen Zugriff wie der entsprechende Konstruktor in X . ...

Sie können den Fehler beheben, indem Sie den abgeleiteten Klassen explizit Konstruktoren hinzufügen, anstatt sie von Base zu übernehmen.

%Vor%

und

%Vor%

Live-Demo

Eine andere Lösung besteht natürlich darin, Base 's Konstruktor public zu machen. Sie könnten auch seinen Destruktor protected angeben, aber das ist nicht notwendig, da die Klasse aufgrund der reinen virtuellen Elementfunktion sowieso nicht instanziiert werden kann.

%Vor%

Live-Demo

    
Praetorian 03.06.2014, 13:02
quelle
3

Freundschaft geht nicht in den Vererbungsbaum . Create ist ein Freund von Base und kann daher nicht auf die geschützten A :: A (int) und B :: B (int) zugreifen.

Mögliche Lösungen sind:

  • Schaffe neue Freundschaften (A, B und weitere Unterklassen sollten Freunde von Create sein)
  • Verwenden Sie öffentliche Konstruktoren, wie von @Snps
  • erwähnt
  • Verwenden Sie eine externe Klasse, die nur Base (und damit auch ihr Freund, Create ) erstellen kann und der Rest nur kopieren kann. Idee von hier .

Code für die letzte Lösung:

%Vor%     
Csq 03.06.2014 12:35
quelle
1

Ich wäre versucht, die Funktion Create() zu einem statischen Mitglied von Base zu machen und dann alle abgeleiteten Klassen zu Freunden von Base zu machen:

Führen Sie das

aus %Vor%

BEARBEITEN: Statische_assertion hinzugefügt

BEARBEITEN: Link zum Ausführungscode hinzugefügt

    
Galik 08.07.2014 16:56
quelle