2017-09-06 1 views
2

POD 멤버가 포함 된 클래스가 있습니다. 하나만 제외하고 모든 구성원을 복사해야합니다 (예의 경우 구성원 a).복사하지 않을 멤버 변수 표시

class Example 
{ 
private: 
    int a = 0; 
    int b = 0; 
    int c = 0; 
    int d = 0; 
    double e = 0; 

public: 
    Example& operator=(const Example &rhs) 
    { 
     b = rhs.b; 
     c = rhs.c; 
     d = rhs.d; 
     e = rhs.e;   

     return *this; 
    } 

    Example() {}; 

    Example(const Example& toCopy) 
    { 
     *this = toCopy; 
    } 
}; 

은 복사 할 수있는 변수를 표시 할 수있는 방법이 있나요, 나중에이 클래스를 수정하는 경우이 방법이 버그에 대한 자세한 정보와 경향이 그 일을 같이 다음과 같이 내가 지금 그것을하고 있어요 방법은 무엇입니까?

+0

@ FrançoisAndrieux 좋은 지적. 그에 따라 코드를 수정했습니다 –

+0

정말'a' 회원이되어야합니까? 복사 생성자 또는 할당 연산자에서 모든 구성원을 복사 할 것으로 기대합니다. 다른 모든 것은 다소 혼란 스럽습니다. –

답변

3

당신은 구조체에서 "이상한 사람이 밖으로", a을 포장하고 별도 구조체의 행동을 정의 할 수 있습니다 : 더 이상 내가 Example을위한 특별한 멤버를 작성 귀찮게하지 않았다

class Example 
{ 
private: 
    CopyLess a; 
    int b = 0; 
    int c = 0; 
    int d = 0; 
    double e = 0; 

    struct CopyLess { 
     int a = 0; 
     CopyLess& operator=(const CopyLess&) { return *this; } 
     CopyLess(const CopyLess&) {} 
    };    
}; 

참고 기본값 때문에 네가 원하는 걸해라. 특별 회원을 가능한 한 많이 쓰는 것을 피하기 위해이 방법으로 코드를 작성하는 것은 "제로 규칙"이라고하며, 자세한 정보 및 예는 http://www.nirfriedman.com/2015/06/27/cpp-rule-of-zero/입니다.

+0

@ user2079303 좋은 캐치 감사합니다. –

+1

좋은 해결 방법. 또한 블로그 게시물을 읽는 것을 즐겼습니다. –

0

아니요, 암시 적 복사본 할당 생략 멤버를 만들 수 없습니다. 이전처럼 사용자 지정 할당 연산자를 정의하면 원하는 동작을 얻을 수 있습니다. 이런 식으로 이렇게

나중에이 클래스를 그룹화 할 수

을 수정하는 경우 버그에 대한 자세한 정보와 경향이 하나의 하위 객체로 복사 한 회원. 이렇게하면 사용자 지정 복사본 할당이 변경 사항에 취약하지 않으며 자세한 내용은 복사 된 구성원 수와 관련하여 일정하게 유지됩니다.

보너스 : 멤버에 대해 별도로 값 초기화를 지정할 필요는 없지만 전체 하위 개체에 대해 하나만 있으면 충분합니다.

class Example 
{ 

    int a = 0; 
    struct { 
     int b; 
     int c; 
     int d; 
     double e; 
    } state = {}; 

public: 
    Example& operator=(const Example &rhs) 
    { 
     state = rhs.state; 
     return *this; 
    } 
... 

회원이 비공개이므로 클래스의 기존 API를 변경하지 않습니다.