Создал класс, и я хочу заставить всех, кто пытается построить объект, использовать unique_ptr
. Для этого я подумал об объявлении конструктора protected
и использовать функцию friend
, которая возвращает unique_ptr
. Так вот пример того, что я хочу сделать:Как получить доступ к защищенному конструктору из функции friend?
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);
}
Я сделал некоторое чтение на других функциях, и я понял, что функция друг обеспечивает доступ к частному/защищенных членам объекта класса.
Есть ли в любом случае я могу сделать свой пример работой?
Даже без функций друзей моя цель состоит в том, чтобы сделать CreateA
только способом для кого-то создать объект.
EDIT
я изменить код немного. Я не упоминал, что мой класс принимает один параметр шаблона. Это делает вещи более сложными, по-видимому.
related: http://stackoverflow.com/questions/8147027/how-do-i-call-stdmake-shared-on-a-class-with-only-protected-or-private-const – Brian
Какова цель метода друга здесь? Если ваша единственная цель - заставить других использовать конструктор, просто сделать его закрытым или защищенным (если вы хотите наследовать этот класс позже) достаточно. –
см. Также «named constructor» –