일반 포인터를 사용하면 다음과 같은 작업을 수행 할 수 있습니다
void conditional_reassign(MyClass* ptr)
{
if (my_condition)
{
delete ptr;
ptr = new MyClass(new_param);
}
}
다음과 같이 변경하고 싶은 포인터를 전달할 수 있습니다
MyClass* ptr = new MyClass(old_param);
conditional_reassign(ptr);
std::unique_ptr
로 이것을 다시 구현하고 싶습니다
. 여기 제가 생각 해낸 내용이 있습니다.
std::unique_ptr<MyClass> conditional_reassign2(std::unique_ptr<MyClass> ptr)
{
if (my_condition)
{
ptr = std::make_unique<MyClass>(new_param);
}
return std::move(ptr);
}
그리고 다음과 같이 부르겠습니다
std::unique_ptr<MyClass> ptr = make_unique<MyClass>(old_param);
ptr = std::move(conditional_reassign2(std::move(ptr)));
질문
라인의 자세한 내용에 만족하지 않습니다
ptr = conditional_reassign2(std::move(ptr));
conditional_reassign2
를 구현하는 방법이 있습니까
conditional_reassign(ptr)
와 비슷한 방식으로 호출 할 수 있도록
과 관련한 주요 문제에 주목해야합니다
ptr = std::move(conditional_reassign2(std::move(ptr)));
원래 개체
ptr
를 파괴한다는 것입니다
my_condition
에 관계없이 지적
( 스마트 포인터를 다시 할당하는 이유는 무엇입니까? 그 자체로 파괴를 일으키는가? )
- 답변 # 1
- 답변 # 2
conditional_reassign2()
를 정의 할 수 있습니다std::unique_ptr
를 가지고 기능 가치 기준대신참조 기준:void conditional_reassign2(std::unique_ptr<MyClass>& ptr) { if (my_condition) { ptr = std::make_unique<MyClass>(new_param); } }
이 방법으로 함수는 전달되는 인스턴스를 직접 수정할 수 있으므로 소유권을 이전 할 필요가 없습니다.
그ptr
가정std::unique_ptr<MyClass>
입니다 그런 다음conditional_reassign2()
를 호출 이 경우에 :conditional_reassign2(ptr);
- 답변 # 3
첫 번째 예는 의도 한대로하지 않습니다.
ptr
로 값으로 전달되면 호출자의 포인터가 수정되지 않습니다. 만약my_condition
true
입니다 호출자에게 삭제 된 객체를 가리키는 포인터가 있으며, 함수가 반환 된 후 새로 작성된 객체가 저장된 주소가 손실됩니다.다음은 고정 된 첫 번째 예입니다 (인수는 이제 포인터에 대한 참조입니다) :
void conditional_reassign((MyClass*)& ptr) { if (my_condition) { delete ptr; ptr = new MyClass(new_param); } }
unique_ptr을 사용하기 위해 참조를 사용하고 아무 것도 반환하지 않을 수 있습니다. 이 방법으로
std::move
를 다룰 필요가 없습니다.void conditional_reassign2(std::unique_ptr<MyClass>& ptr) { if (my_condition) { ptr = std::make_unique<MyClass>(new_param); } }
다음과 같이 호출 할 수 있습니다 :
std::unique_ptr<MyClass> ptr = make_unique<MyClass>(old_param); conditional_reassign2(ptr);
반환/이동 시맨틱을 사용할 수 있습니다 :
std::unique_ptr<MyClass> conditional_reassign(std::unique_ptr<MyClass> ptr) { if (my_condition) { return std::make_unique<MyClass>(new_param); } return ptr; }
그리고 다음과 같이 부르십시오 :
std::unique_ptr<MyClass> ptr = make_unique<MyClass>(old_param); ptr = conditional_reassign2(std::move(ptr));
관련 자료
- python - 내 로그인 기능이 func에 작성된 작업을 수행하지 않고 리디렉션하는 이유
- c - 함수에서 반환 된 char 포인터에 free ()를 사용할 수 없습니다
- python - 함수는 어떤 종류의 루프도없이 계속해서 실행됩니다
- C에서 함수에 대한 포인터 전달시 혼란
- c++ - const 클래스 함수에서 클래스 포인터의 값을 변경하면 일부 컴파일러에서는 오류가 발생하지만 다른 컴파일러에서는 오류가 발생하지 않습니다
- kotlin - 호출자 기능을 차단하지 않고 다른 일시 중지 기능에서 일시 중지 기능을 호출하는 방법은 무엇입니까?
- c++ - 뮤텍스 멤버와 함께 스마트 포인터를 사용할 수 있습니까?
- c++ - 공유 포인터 또는 원시 포인터를 함수에 전달할지 여부
- c - 3 개의 정수 포인터를 인수로 취하고 문자 포인터를 반환하는 함수 포인터 프로토 타입
- c - 함수의 포인터 배열에 숫자 삽입
- 포인터를 반환하지만 해당 포인터를 삭제할 수없는 C ++ 클래스 공용 함수?
- php - imagepng () 함수를 사용하지 않고 이미지를 저장하는 방법은 무엇입니까?
- python - 재귀없이 함수 만들기
- pyspark - Spark Core Rddmax ()를 사용하지 않고 RDD 함수의 최대 n 개 행을 가져 오는 방법
- reactjs - 래핑 화살표 함수를 사용하거나 사용하지 않고 두 함수를 호출하는 방법
- parameters - 함수에서 변수를 다시 할당하는 방법 (파이썬)
- oracle - 합계 함수없이 SQL 그룹화
- c++ - 관계없이 다른 클래스의 기능에 액세스
- c++ - 스마트 포인터 구문
- swift - 무작위 함수를 선택하는 현명한 방법
참조로 포인터를 전달해야합니다
단일 이동이 필요한 포인터를 반환
또한 명시 적으로 move를 호출하지 않고도 함수에서 직접 ptr을 반환 할 수 있습니다.