공장 방법에서 std::unique_ptr
을 반환하는 것은 좋으며 권장되는 방법입니다. 전달하는 메시지는 다음과 같습니다 (IMO) : 이제이 개체의 유일한 소유자가되었습니다. 또한, 여러분의 편의를 위해, 객체는 스스로를 파괴하는 방법을 알고 있습니다.
이것은 원시 포인터 (클라이언트가이 포인터를 처리하는 방법과 기억해야 할 위치)를 반환하는 것이 훨씬 낫다고 생각합니다.
그러나 평생 연장하기 위해 포인터를 공개하는 것에 대한 귀하의 의견을 이해하지 못합니다. 일반적으로 나는 release
을 smartpointer로 호출하는 어떤 이유도 볼 수 없다. 왜냐하면 포인터는 항상 RAII 구조에 의해 관리되어야한다고 생각하기 때문이다. (단지 release
이라고하는 유일한 상황은 다른 관리 데이터 구조에 포인터를 두는 것이다. 추가 정리를 보증하기 위해 뭔가를 한 후에 다른 deleter가있는 unique_ptr
).
따라서 클라이언트는 (그리고해야한다) 단순히 unique_ptr
곳을 저장할 수 있습니다 (예 : 된 움직임 반환 일로부터 구축 한 또 다른 unique_ptr
등)만큼 그들은 여러 복사본을 필요로하는 경우가 객체 (또는 shared_ptr
을 필요로하는 포인터의).따라서 클라이언트 측 코드는 더 같이해야한다 : 나는 또한 (이 경우 std::unique_ptr<Foobar>
에서) 반환 된 포인터 유형에 대한 typedef
를 추가
개인적으로
std::unique_ptr<FooBar> myFoo = Foobar::factory(data);
//or:
std::shared_ptr<FooBar> myFoo = Foobar::factory(data);
와 나 (이 경우 표준에 :: default_deleter)를 사용 Deleter가에 당신의 팩토리 객체. 나중에 포인터 할당을 변경하기로 결정한 경우 (따라서 포인터를 파기하는 다른 방법이 필요하며 두 번째 템플릿 매개 변수 std::unique_ptr
으로 표시됨)이 더 쉽습니다. 이렇게하면 다음과 같이됩니다 :
class Foobar {
public:
typedef std::default_deleter<Foobar> deleter;
typedef std::unique_ptr<Foobar, deleter> unique_ptr;
static unique_ptr factory(DataObject data);
}
Foobar::unique_ptr myFoo = Foobar::factory(data);
//or:
std::shared_ptr<Foobar> myFoo = Foobar::factory(data);
클라이언트에게 포인터를 소유하고 있음을 알리기 위해 unqiue_ptr을 반환합니까? 이는 정확하게 (내가 고유 한 포인터의 소유권을 명시 적으로 가져야하기 때문에) 예상했던 것의 반대입니다. – jknupp
대신 C++ 11을 사용할 수있는 경우 move-semantics를 사용할 수 있습니다. 이를 통해 사용자는 공장에서 생성 된 객체의 수명을 연장하는 방법을 결정할 수 있습니다. – evnu
@evnu 그건 당신을 위해 자동으로 이루어진 것입니다. –