문제

나는 궁리의 사용 unique_ptrshared_ptrown_solution.나는 할인가로 후반으로 난 것이 거의 확실히 잘못하고 있어요,하지만 문제 unique_ptrshared_ptr 에서는 어느 쪽도 캡처 정확하게 내가 무엇을 원합니다.게 만들려는 리소스 관리자는 명시적으로 소유하는 리소스,그러나 나는 다음과 같이 리소스 관리자는 또한 참조 자원입니다.

내가 사용하는 경우 unique_ptr 리소스 관리자는 손으로 원 포인터가 가능성이 그들은 다른 곳에서 탈출 할 수 있(지만 이 것에 대해 클래"계약"나).내가 사용하는 경우 shared_ptrweak_ptr, 아무것도 없 중지에서 발신자 변환 weak_ptrshared_ptr 고 저장하는함으로써 잠재적으로 만들 사이클 또는 악화,자원활 수명을 넘어 리소스의 관리자입니다.그래서 가정이 무엇 내가 찾는 것은 deferencable weak_ptr 할 수 없으로 변환 shared_ptr.

또는 난 그냥을 찾을 적용하는 계약 일부 강하게 말로 주석 코드에서?

주셔서 감사합니다 생각할 수 있습니다.

도움이 되었습니까?

해결책

스마트 포인처럼 shared_ptrunique_ptr 좋은 도구가 있을 때 소유 포인터입니다.
하지만 비유 포인터,즉 포인터를 관찰, 를 사용하여,원 포인터입니다.

에서 당신의 디자인,제가 생각하는 리소스 관리자만"소유자"의 자원,그래서 당신은 단순히 수은 어떤 형태의 스마트 포인터 리소스 관리자입니다.예를 들어,리소스 관리자가 있을 수 있는 std::vector<std::unique_ptr<Resource>> 으로 데이터 구성원 또는 단순 std::vector<Resource> 하는 경우 Resource 클래스가 될 수 있도록 설계 올바르게 저장할 수 있는지에 std::vector.

그런 다음,리소스 관리자에게 줄 수 있는 외부 무관을 소유하는 관찰하는 점,그리고 원 포인터(또는 C++를 참조)은 이 경우입니다.

의 과정,그것의 중요한 수명 동안 발생하는 리소스의 관리자를 초과하는"리소스 클라이언트가".

다른 팁

결국,당신은 힘이 없다는 사람이 들어 있습니다.요청 마이크로소프트에서 애플이나 오픈 소스 라이브러리 개발자,그들은 그들 모두가 알고있는 노래입니다.댓글을에서 마우스 오른쪽 단어와 장소는 당신의 최선의 방법입니다.

을 만들지 않는 자신의 스마트 포인터를 클래스를,그것은 방해성 줄이고 가독성을 높입니다.마지막으로,시험 보고서,부스트 또는 프레임워크의 코드가 이미 있습니다.

만약 당신이 아닌 소유자,그들은 하나 electable 고 weak_ptrs 또는(있다면 그것은 보장에 대해 유효한 기간)원 포인터입니다.
당신이 사용하는 경우 shared_ptrs 내부적으로(당신은 왜),최고의 제공 weak_ptr 고 원 포인터입니다.

모든 사람들이 스마트 포인터를 명시적으로 나타내는 소유권 정책입니다.원 포인터내는 아무도 또는 비 소유한다.

  • auto_ptr:를 사용하지 않는 사용되지 않으로 너무 많은 함정에도에 대한 조심하시길 바랍니다.
  • unique_ptr:단독 소유입니다.
  • shared_ptr:공동 소유권
  • weak_ptr:소유권,삭제 될 수 있습니다.
  • 원 포인터
    • 명시적으로 소유권으로 보장 큰 일생
    • 또는 매뉴얼 소유권을 관리합니다.

그래서 가정이 무엇 내가 찾는 것은 deferencable 합니하는 로 전환할 수 없습 shared_ptr.

할 수 있는 손으로 당신의 하나의 작은 도우미 클래스:

template<typename T>
class NonConvertibleWeakPtr
{
public:
   NonConvertibleWeakPtr(const std::shared_ptr<T>& p) : p_(p) {}
   ... // other constructors / assignment operators
   bool expired() const { return p_.expired(); }
   T* operator->() const { return get(); }
   T& operator*() const { return *get(); }
private:
   T* get() const { return p_.lock().get(); }
private:
   std::weak_ptr<T> p_;
};

이보다 약간 더 나은 원시인할 수 있기 때문에 체크인하는 경우 포인터입니다 여전히 유효합니다.

를 들어 사용:

std::shared_ptr<int> sp = std::make_shared<int>(5);
{
    NonConvertibleWeakPtr<int> wp(sp);
    if(!wp.expired()) {
        std::cout << *wp << std::endl;
    }
}

그러나 사용자가 아직도 그것을 오용 예를 들어과 std::shared_ptr<T> blah(&(*wp));, 지만,그것은 약간 더 형 에너지입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top