Ho creato una classe e voglio forzare chiunque stia cercando di costruire un oggetto, per usare unique_ptr
. Per farlo ho pensato di dichiarare il costruttore protected
e utilizzare una funzione friend
che restituisce un unique_ptr
. Quindi, ecco un esempio di quello che voglio fare:Come posso accedere ad un costruttore protetto da una funzione amico?
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);
}
Ho fatto qualche lettura sulla funzioni friend e ho capito che una funzione amico fornisce l'accesso ai membri privati / protetti di un oggetto di una classe.
Esiste comunque il mio esempio?
Anche senza funzioni friend, il mio obiettivo è quello di rendere il modo in cui l'CreateA
solo per qualcuno per creare un oggetto.
EDIT
cambio il codice un po '. Non ho detto che la mia classe prende un parametro di modello. Questo rende le cose più complesse in apparenza.
correlati: http://stackoverflow.com/questions/8147027/how-do-i-call-stdmake-shared-on-a-class-with-only-protected-or-private-const – Brian
Qual è lo scopo del metodo amico qui? Se il tuo unico obiettivo è impedire agli altri di usare il costruttore, è sufficiente renderlo privato o protetto (se vuoi ereditare questa classe in seguito) è sufficiente. –
vedi anche "named constructor" –