문제

다음 코드를보고 앞으로 문제를 일으킬 것인지, 그렇다면 피하는 방법을 알려주십시오.

class Note
{
   int id;
   std::string text;

public:
   // ... some ctors here...

   Note(const Note& other) : id(other.id), text(other.text) {}

   void operator=(const Note& other) // returns void: no chaining wanted
   {
      if (&other == this) return;
      text = other.text;  
      // NB: id stays the same!    
   }
   ...
};

요컨대, 사본 생성자가 (데이터베이스) ID 필드를 포함하여 객체의 정확한 사본을 만들기를 원합니다. 반면에 할당하면 데이터 필드를 복사하고 싶습니다. 그러나 보통 COPTOR와 연산자 = 동일한 의미론이 있기 때문에 몇 가지 우려 사항이 있습니다.

ID 필드는 Note와 친구로만 사용됩니다. 다른 모든 클라이언트의 경우 과제 연산자가 정확한 사본을 만듭니다. 유스 케이스 : 메모를 편집하려면 COPTOR를 사용하여 사본을 만들고 편집 한 다음 노트를 관리하는 노트북 클래스에서 저장을 호출합니다.

 Note n(notebook.getNote(id));
 n = editNote(n); // pass by const ref (for the case edit is canceled)
 notebook.saveNote(n);

반면에 기존 메모와 동일한 내용을 가진 완전히 새로운 메모를 만들고 싶을 때 다음을 수행 할 수 있습니다.

 Note n; 
 n = notebook.getNote(id); 
 n.setText("This is a copy");
 notebook.addNote(n);

이 접근법은 그럴듯합니까? 그렇지 않다면, 가능한 부정적인 결과가 무엇인지 지적하십시오! 정말 감사합니다!

도움이 되었습니까?

해결책

과제 연산자로부터 기대되는 내용과 일치하지 않는 시맨틱을 원한다면 사용하지 마십시오. 대신 개인을 선언하여 비활성화하십시오 operator= 그리고 무슨 일이 일어나고 있는지 명확하게하는 이름으로 함수를 정의합니다. copyDataFields.

다른 팁

이것은 귀하의 특정 사례에 효과가있을 수 있지만 일반적으로 권장하지는 않습니다.

STL과 같은 라이브러리는 사본 생성자 및 할당 연산자가 "예상처럼"작동 할 것으로 기대합니다. C ++ 시맨틱을 위반하면 물체의 STL 컨테이너가 제대로 작동하지 않을 수 있습니다. STL은 컨테이너에 따라 다른 상황에서 카피 생성자와 할당 연산자를 모두 호출합니다.

코드가 당신이 생각하는 일을하지 않으면 완전히 혼란스러워지는 것은 매우 쉽습니다.

기술적으로, 그것은 가능하고 기술적으로는 효과가 있지만 그렇게하지 않을 것입니다. 내가 보는 문제는 다음과 같습니다.

  1. C ++ 모집단이 알려진 과제 연산자의 "자연"시맨틱을 변경합니다.

  2. 사본 구성 및 과제 인 두 쌍둥이 운영은 시맨틱이 다르기 때문에 일치하지 않습니다.

  3. 실수로 호출하기 쉽기 때문에 솔루션은 오류가 발생합니다. 생성자 복사 과제로 보이더라도. 프로그래머가 두 번째 유스 케이스를 이런 식으로 작성하는 경우 :

    Note n = notebook.getNote(id);
    

    그런 다음 복사 생성자가 호출됩니다. 과제가 아닙니다, 당신은 얻습니다 n 예상과 다른 대상으로.

당신의 의도를 명확하고 명확하게 만들지 않겠습니까?

Note& Notebook::editNote(int id);
Note  Notebook::createNote(int id);
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top