2012-07-17 3 views
1

나는 내 자신의 생성자, 소멸자, 복사 생성자 및 복사 할당 연산자를 구현 한 클래스가 있습니다.연산자와 생성자

클래스에는 위의 모든 내용에있는 핵심 구성원 집합과 일부 메서드에 대한 도우미로 추가 한 "상태 변수"집합이 있습니다.

이 상태 변수는 생성자에서 초기화되었지만 사용되기 전에 초기화되지 않기 때문에 (절대로 신경 쓰지 않았기 때문에) 결코 사용되지 않습니다.

이와 같이 복사 생성자와 복사 할당은 아무 것도하지 않습니다. 그들은 단지 내가 명시 적으로 원하는 회원들을 복사합니다.

  • 이것이 문제가 될 수 있습니까?
  • 명시 적으로 복사되지 않은 멤버는 어떻게됩니까? (btw,이 멤버에 포인터가 없음)?
    • 그들은 또한 생성자
  • 에서 초기화되지 않은 수있는 "숨겨진"문제에 대한이 리드? 당신이 사용하기 전에 그들을 initilize와 나는 어떤 문제가 표시되지 않습니다 (포인터의 경우) 해제하는 것을 잊지 마세요 - 경우

건배 앙드레

+0

+1 첫 번째 문장 : –

답변

1

이러한 변수가 개체 상태의 일부인 경우 복사해야합니다. 변수가 객체 상태의 일부가 아닌 경우 멤버 변수가 아니어야합니다.인터페이스에서 함수의 결과가 조작 시작 전 변수의 값에 따라 달라지는 경우 변수는 오브젝트 상태의 일부입니다.

위의 일반적인 규칙에 대한 예외는 거의 없으며, 특히 개체의 상태에 참여하지 않는 몇 가지 멤버 변수가 있습니다 (일반적으로 mutable으로 표시됨). 복잡한 메커니즘의 결과에 대한 동기화 메커니즘이나 캐시로 사용됩니다. 작업.

문제로 돌아가서 설명을 통해 다른 구성원 기능 간의 통신 메커니즘으로 만 해당 구성원을 사용하고있는 것으로 보입니다. 인터페이스의 한 함수는 값을 설정 한 다음 값을 읽거나 수정하는 다른 함수를 호출합니다. 이 경우 변수를 함수에 인수로 전달하는 것을 고려하십시오. 멤버를 사용하면 해당 값을 향해 함수의 종속성을 숨기고 동시에 클래스에 종속성을 추가 할 수 있습니다.

인터페이스의 함수 중 하나라도 해당 멤버에 액세스하면 할당 및 복사 구성 후에 소스와 대상이 다르게 동작하므로 복사 초기화/할당 소스와 대상 객체는 등가입니다.

기본적으로 실용적인 관점에서 볼 때 해당 멤버가 개체 상태의 일부가 아니라면 현재 접근 방식을 벗어날 수 있지만 실제로 디자인을 다시 생각해 볼 수 있습니다. 그들이 물건의 상태에 참여한다면, 어떤 방법으로도 그 물건을 복사해서는 안됩니다.

3

Can this be a problem?

.

What happens to members that aren't explicitly copied (btw, no pointers in these members)? they are also not initialized in the constructor

- 그들은 홀드 쓰레기

Can this lead to any "hidden" problems?

아니, 당신은

자르하지만 나는 그것이되기 때문에 어떤 경우에도 생성자에서 그들을 initilized 당신을 제안하는 경우 오류를 쉽게 잡아낼 수 있으며 객체를 항상 완전한 상태로 유지할 수 있습니다. 예를 들어 nullptr 포인터 다음에 가비지 포인터 또는 할당 해제 된 객체에 대한 포인터를 잡는 것이 훨씬 쉽습니다. 첫 번째 경우 프로그램이 충돌 할 것이므로 (null 포인터는 UB를 역 참조하는 것이 일반적이지만 단지 충돌 일뿐입니다)

또한 가능하면 중간 결과를 저장하는 것을 선호합니다. 단일 메소드 중간 결과가 아니라면 - 초기화되기 전에 다른 메소드에서이 변수를 사용하면 넘어 질 가능성이있는 곳입니다. 이 경우 0으로 초기화 된 변수를 저장하는 것이 훨씬 낫습니다. 따라서 assert은 계산을하기 전에 유효한 상태입니다.

1

C++ 관점에서 보면 C++의 관점에서 보면 아무 것도 없지만 C++은 여러분을 보호하지 않습니다 발에서 총을 쏜다. 몇 달 안에 릴리스 빌드에서만 발생하는 오류를 디버깅 할 수 있습니다. 그런 다음 왜 이런 일이 발생하는지 알아 내려면 며칠을 보내야합니다. 릴리스에서 작동하지만 디버그에서 작동하지 않는 이유는 여러 가지입니다. 원인 중 하나는 디버그 힙이 할당 된 메모리를 초기화한다는 것입니다.