2013-04-20 3 views
2

C++에서 쓰기 포인터 복사를 구현하는 방법에 대해 http://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Copy-on-write에 따라 시도했습니다. 문제는 그것이 나를 위해 작동하지 않는다는 것입니다.C++에서 쓰기 복사 포인터 객체

는 개체의 핵심은 그것이 const가 아닌 참조 반환해야하는 경우 배경 복사를 할 참조 연산자 (*)를 오버로드에

: 슬프게도

const T& operator*() const 
    { 
     return *m_sp; 
    } 
    T& operator*() 
    { 
     detach(); 
     return *m_sp; 
    } 

, 단지 두 번째 버전은 그 어느 것 같다 운영. 내 뾰족한-에 반대 복사본을 생성 C-나들이, 심지어

CowPtr<string> my_cow_ptr(new string("hello world")); 
    const string& const_ref=*my_cow_ptr; 

같은 일을하는 것은 실행할 수있는 detach() 기능을 발생합니다.

왜 광고로 작동하지 않는지에 대한 아이디어가 있으십니까?

+0

이것은 *하지 * 기록 중 복사 (이 일 경우에도). –

+0

컨텍스트를 더 표시 할 수 있습니까? 'my_cow_ptr'을 어떻게 선언합니까? –

+0

@Andy Prowl : 두 번째 발췌 문장을 확장했습니다. 링크에 정의 된 CowPtr ID입니다. – PSkocik

답변

1

const 구성원 함수는 const 개체에서 호출됩니다. 그래서 :

const CowPtr<std::string> my_const_cow_ptr(new std::string("Hello, world")); 
const std::string& str = *my_const_cow_ptr; 

또는

CowPtr<std::string> my_cow_ptr(new std::string("Hello, world")); 
const std::string& str = *static_cast<const CowPtr<std::string>&>(my_cow_ptr); 
+0

그러나 이것은 또한 모든 호출에서 const-casting을 제외하고 컴파일러가 각 함수를 자동으로 호출하는 방법을 알지 못한다는 것을 의미합니다. 따라서 copy-on-write의 전체 지점이 소모됩니다. – Born2Smile