Ich habe eine Klasse erstellt und möchte jeden, der ein Objekt erstellen möchte, dazu zwingen, unique_ptr
zu verwenden. Dazu habe ich gedacht, den Konstruktor protected
zu deklarieren und eine friend
Funktion zu verwenden, die eine unique_ptr
zurückgibt. Also hier ist ein Beispiel dafür, was ich tun möchte:Wie kann ich über eine Friend-Funktion auf einen geschützten Konstruktor zugreifen?
template <typename T>
class A
{
public:
friend std::unique_ptr<A<T>> CreateA<T>(int myarg);
protected:
A(int myarg) {}
};
template <typename T>
std::unique_ptr<A<T>> CreateA(int myarg)
{
// Since I declared CreateA as a friend I thought I
// would be able to do that
return std::make_unique<A<T>>(myarg);
}
Ich habe einige Lesung zu Freund Funktionen und ich verstanden, dass ein Freund-Funktion Zugriff auf private/protected Mitglieder eines Objekts einer Klasse zur Verfügung stellt.
Gibt es trotzdem kann ich mein Beispiel arbeiten lassen?
Auch ohne Freund Funktionen, ist mein Ziel, die CreateA
die nur Weg für jemanden ein Objekt zu erstellen.
EDIT
ich den Code ändern, um ein Bit. Ich habe nicht erwähnt, dass meine Klasse einen Template-Parameter benötigt. Das macht die Dinge anscheinend komplexer.
im Zusammenhang: http://stackoverflow.com/questions/8147027/how-do-i-call-stdmake-shared-on-a-class-with-only-protected-or-private-const – Brian
Was ist der Zweck der Freund Methode hier? Wenn Ihr Ziel nur darin besteht, andere davon abzuhalten, den Konstruktor zu verwenden, reicht es aus, ihn privat oder geschützt zu machen (wenn Sie diese Klasse später erben wollen). –
siehe auch "named constructor" –