2012-06-19 6 views
3

클래스가 약 50 명입니다. 그 중 1 개는 포인터입니다. 그래서, 당연히 나는 내 자신의 복사 생성자를 만들고 모든 것을 복사하고 그 객체의 새로운 인스턴스를 만들어야 만합니다. 내 질문은 : 지름길 또는 일부 복사 할 수있는 몇 가지 특별한 방법이 있습니까 (기본 복사 생성자 않습니다) 그런 다음 한 포인터를 처리 할? 수동으로 각 구성원을 복사하는 것이 아닙니다.복사 생성자 바로 가기

+0

50 회원들! 이것을보십시오 : http://objectmentor.com/resources/articles/srp.pdf –

답변

6

당신이 원하는 방식으로 복사본을하는 도우미 클래스에 포인터를 래핑 할 수 있습니다. 그렇게하면 기본 클래스로 큰 클래스를 떠날 수 있습니다.

+0

그것을하는 청결한 방법. –

+0

즐겁게도 Pimpl 관용구를 쉽게 지원할 수있는 클래스를 작성했습니다. 그것은 반드시 쉬운 수업은 아니지만 한 번 끝내면 어디에서나 다시 사용할 수 있습니다 : D –

+0

또는 포인터가 아닌 모든 데이터를 자체 구조체에 넣을 수 있습니다. –

0

대신 스마트 포인터를 사용하고 클래스의 기본 복사 생성자를 사용하십시오.

표준 스마트 포인터 (unique_ptr, shared_ptr)에는 개체를 복사하는 복사 생성자가 없지만 직접 복사 할 수 있습니다.

+0

'shared_ptr' doesn ' 복사 생성자가 있습니까? –

+0

개체를 복사 할 복사 생성자가 없습니다 (내부 포인터를 복사하고 참조 카운터를 증가시킵니다) – Kos

0

기본 복사본이 작동하지 않는다고 했으므로 개체가 pointee를 소유한다고 가정합니다.

제대로 정리되는 얕은 사본이 필요한 경우 C++ 11 또는 부스트에서 shared_ptr을 사용하십시오.

깊은 복사본이 필요한 경우 먼저 포함 된 개체를 포인터 대신 값으로 저장하도록 제안합니다. 그런 다음 복사본을 무료로 가져오고 추가 메모리 관리 세트에 대해 걱정할 필요가 없습니다.

마지막으로 옵션이없는 경우 딥 복사 의미를 처리하는 포인터 래퍼를 작성합니다 (부스트가 이러한 클래스를 제공한다고 생각하지 않습니다).

+0

값으로 저장하면 소유권을 구현하는 # 1 옵션이지만 몇 가지 제한 사항이 있습니다 (예 : 두 개체 바인딩 '평생 함께, 항상 바람직한 것은 아니다). 값처럼 작동하는 스마트 포인터는 OP의 경우에도 유용 할 수 있습니다. 스탠다드 라이브러리 나 부스트도 하나도 없다는 이상입니다. – Kos