2013-04-09 3 views
1

나는 boost :: shared_array 멤버가 포함 된 클래스가 있습니다. 다른 멤버들은 역동적이지 않습니다. 단지 많은 int, 포인터가 없습니다. 그런 클래스에 대한 기본 복사 생성자는 괜찮을 것으로 기대합니다.복사 생성자 및 할당 연산자로 boost :: shared_ *

이 내 가정이다 :

  1. 의 내가, 오리지널를이 클래스의 인스턴스가 있다고 가정 해 봅시다.
  2. 오리지널의 부재하는 shared_array 이제 오리지널 사본 1
  3. 참조 카운트 생성했다 :

    = 오리지널 복사하는 단계; 위의 올바른은

  4. 내가 지금 2

의 참조 카운트를 모두 사본오리지널이 동일한 기본 메모리를 가리 shared_arrays을 가지고 각을 기대 인가?

boost :: shared_ * 회원이있을 때 기본 복사 생성자에 대해 경고하는 사람들이 겁이났습니다.하지만 왜 기본이 좋지 않거나/나쁠 수 있는지 설명을 찾을 수는 없습니다. 예를 들어, 다음은 명시 적으로 복사/할당이 정의되어야한다라고 누군가에 의해 코멘트는하지만 왜 아무런 설명 : 복사 생성자와 대입 연산자가 필요로 할 때

https://stackoverflow.com/a/716112/629530

누군가가 명확히 수는 클래스에 대해 정의 할 수 boost :: shared_ * (shared_array 및 shared_ptr) 멤버가 포함되어 있습니까?

+0

기술적으로 기본 복사 생성자가 정확합니다. 그러나 전체 복사본 대신 얕은 복사본 만 만듭니다. 그러나 대부분의 사람들은 복사본이 원본 개체와는 별도로 깊다고 생각합니다. – nosid

+0

감사 인사. 명확히하기 위해, 내가 준 예제에서 얻은 나의 이해가 정확하다는 말입니까?어쨌든, 나는 대답을 좀 더 자세히 설명해 줄 것을 권유한다. – firebush

답변

1

다음 클래스는 shared_ptr을 함께 조합하여 Pimpl 관용구를 사용

class location 
{ 
    struct impl 
    { 
     double _latitude; 
     double _longitude; 
    }; 
    std::shared_ptr<impl> _impl; 
public: 
    location(double latitude, double longitude) 
     : _impl{new impl{latitude, longitude}} 
    { } 
    void move_to(double latitude, double longitude) 
    { 
     _impl->_latitude = latitude; 
     _impl->_longitude = longitude; 
    } 
    // ... 
}; 

코드는 컴파일하고 작동합니다.

location london{51.51, 0.12}; 
location paris = london; 
paris.move_to(48.86, 2.35); 
std::cout << "London: " << london << '\n'; // prints 48.86/2.35 

객체의 복사본이 아니라 원본 객체에 영향을 변경 : 그러나, 이상한 행동이있다. 이 경우 std::shared_ptr 대신 std::unique_ptr을 사용하는 것이 더 좋습니다. 왜냐하면 우리 자신의 복사 생성자를 작성해야했기 때문입니다.

std::shared_ptr의 동작이 필요한 경우도 있습니다. 메트릭 일부가 아니므로하는 std::shared_ptr 완벽하게 작동이 경우

std::shared_ptr<metric> _metric; 
    double operator-(const location& rhs) const 
    { 
     return _metric->distance(*_impl, *rhs->_impl); 
    } 

:의이 (다른 계산 거리에 대한 전략이있을 수 있기 때문에) 두 위치 사이의 거리를 계산하는 데 사용되는 멤버 변수 metric을 추가 할 수 위치의 지각 된 상태에 대한 정보를 제공하며 메트릭을 변경할 수있는 방법은 없습니다.

+0

아주 좋습니다. 고마워요! 답변을 수락했습니다. 귀하의 의견 외에도 공유 자원이 공유 되더라도 shared_ptr과 관련된 "안전성"이 손상되지 않았 음을 명시합니다. 즉, london과 paris는 둘 다 범위에서 벗어 났을 때 포인터를 삭제합니다. 공유 메모리 위치의이 얕은 사본이 원하는지 아닌지 여부를 보여줍니다. – firebush

관련 문제