2008-11-06 9 views
0

필자는 너무 작아서 개발 중이며 (자주 변경됨) public copy 생성자와 복사 할당을 제공 할 필요가 없습니다. 클래스에는 값 의미가있는 개체가 있으므로 기본 복사 및 할당 작업이 필요합니다.복사 생성자를 비공개로 선언하고 기본 복사 생성자를 사용하는 방법이 있습니까?

클래스는 가상 메서드로 계층 구조에 있으므로 복제를 피하고 "다형 복사본"을 수행하기 위해 가상 Clone()을 제공합니다.

수행 할 특별한 것이없는 한 사본 할당 및 보호가 선언되어이를 정의하고 (변경 사항과 동기를 유지하기 위해) 선언하고 싶지 않습니다.

다른 방법이 있는지 아는 사람이 있습니까?

감사합니다.

UgaSofT

+0

매우 명확합니다. 내부 복사본으로 사용할 수있는 기본 복사본을 갖고 싶지만 공개는 아닙니다. –

+0

Ooops ... "당신은 분명하지 않습니다"라고 읽어야합니다. –

+0

예, 기본 사용 권한을 내부 용으로 사용할 수 있지만 공개는 아닙니다. – ugasoft

답변

3

다형성 계층 구조의 개체이며 값 의미가 있습니까? 뭔가 잘못되었습니다.

클래스에 값 의미가 필요하면 J.Coplien의 Envelop-Letter Idiom 또는이 기사의 Regular Objects [1]를 살펴보십시오.

[1] Sean Parent. "대상 너머". 우리가 쓰는 소프트웨어 이해하기. http://stlab.adobe.com/wiki/index.php/Papers_and_Presentations. C++ 연결. 11월 2005

HTH,

+0

예, 가능합니다. 내 계층 구조에서 나는 다른 계층 구조의 기본 클래스에 스마트 포인터를 사용합니다 ... 실제 포인터로 가리키는 데이터의 실제 유형은 파생 클래스에 의해 결정되고 딥 복사는 가상 복제에 의해 수행됩니다. 기본 복사본 ctor는 ok이므로 가치 클래스가 있습니다. – ugasoft

+0

해결할 조각화 문제가 없습니까? 정말 당신의 물건이 복사 가능해야합니까? 저는 종종 이것이 잘못된 요구 사항이라는 것을 시간이 지남에 따라 배웠습니다 : 우리가 필요하다고 생각하지만 실제로는 결코 사용하지 않는 것입니다. –

+0

어쩌면 당신 말이 맞아요.하지만 스마트 포인터를 통해 내 물건 자체를 사용하기 때문에 ...하지만 내 물건을 복제 할 수 없다면 나는 악몽없이 잠을 자랄 겁니다! – ugasoft

0

나는 당신이 할 수있는 C++ 언어 거기에 아무것도 생각하지 않습니다. 나는이 점을 잘못 알고 싶다.

저는 과거에이 문제에 봉착 해 다음과 같은 해결책을 제안했습니다. Asumme 클래스는 C1입니다.

  1. 대신
  2. 보호 된 복사 생성자 C1 사이에 바로 복사 데이터 인스턴스를 정의 나 데이터에 C1에서 delare 것입니다 내 모든 멤버를 넣어 데이터
  3. 라는 개인 내부 클래스를 정의합니다.

이 접근법에는 몇 가지 단점이 있습니다. 즉, 약간 자연스럽지 않고 직접 필드 액세스를 제거합니다 (작은 액세서 기능으로 완화 할 수 있음).

당신이 찾고있는 것을 원만하게하는 방법이지만 복사 생성자를 직접 작성하지 않아도됩니다.

0

은 어쩌면 내가, 내 루트 기본 클래스에 넣을 수 있습니다 (또는 내가 데이터가없는 회원들과 작은 인터페이스 클래스를 만들 수 있습니다 ...

을 해결책을 발견했습니다 다중 상속 수행) 보호 된 복사본 생성자가 비어 있습니다. 파생 클래스에서 Copy ctor를 재정의하지 않습니다. 기본값은 괜찮습니다. 이제 기본 복사 도구가 클라이언트에 액세스 할 수 없으므로 (기본에 액세스 할 수 없기 때문에) 기본 작동합니다!

몇 가지 이의가 있습니까?

0

C++ 0x를 사용할 수 있다면 ...

class A 
{ 
    protected: 
     A(const A&) = default; 
}; 
관련 문제