1

은 어디 선가 그 때 나는 이후리팩터링 중 struct safe의 집계 초기화가 있습니까? 내가 구조체</p> <pre><code>SomeStruct { double y; double x; }; </code></pre> <p>하고있는 경우

SomeStruct 
{ 
    double x; 
    double y; 
    double z; 
}; 

내 구조체의 순서를 변경하면 내 코드가 자동으로 중단 할 수있는 것 같은

SomeStruct s{1,2}; //y=1 x=2 

초기화 현재 SomeStruct s{1,2}은 x = 1, y = 2, z = 0을 의미합니다.

편집 : 인수가 생성 된 것은 생성자가 동일한 문제를 가지고 있다는 것입니다.하지만 근본적으로 인수 이름과 주문을 볼 수 있습니다. 현대 IDE를 사용하는 경우 더욱 분명합니다.

아무도이 언급을 보지 못했지만 데이터 레이아웃을 변경하지 않는다고 확신하는 경우 안전하게 초기화를 사용할 수 있습니다. 그것은 희귀 한 상황이 될 것입니다. 그래서 "무질서한 구조체에 집계 초기화를 사용하지 마십시오"라는 무언의 규칙이 있습니까?

+0

생성자에는 실제로 동일한 문제가 있습니다. 이것은 초기화보다는 유형에 관한 문제입니다. –

+0

그러나 생성자에 새 객체를 추가하면 새 객체가없는 경우 코드가 컴파일되지 않습니다. 문제는 코드가 컴파일되고 아무도 오류가 있음을 인식하지 못합니다. – Ventu

+0

@Ventu : 그렇습니다.하지만 같은 유형의 필드를 재정렬하거나 생성자 매개 변수의 순서를 바꾸면 조용한 변경 사항을 적용 할 수 있습니다. –

답변

0

리팩토링하는 동안 struct safe의 집계 초기화가 있습니까?

이 컨텍스트에서 "안전"을 정의하는 방법에 따라 다릅니다. 그리고 어떤 종류의 리팩토링이 수행됩니다.

내 코드가 자동으로 중단 할 수있는 ... 지금 SomeStruct s{1,2}

x=1, y=2, z=0 완벽하게 확인 될 수있는 것을 의미하기 때문에 보인다. 왜 z를 0으로 초기화하면 안됩니까? 당신은 그것이 무엇을 나타내는 지 알 때까지 깨진 지 알 수 없습니다.

이것은 수업에 할 수있는보다 중대한 변경 사항 중 하나입니다. 멤버를 재정렬하는 것과 같은 다른 변경 사항은 종속 코드의 변경을보다 확실하게 요구합니다.

데이터 레이아웃을 변경하지 않는다고 확신하는 경우에만 이와 같은 집계 초기화를 안전하게 사용할 수있는 것처럼 보입니다.

또는 유일한 변경 사항이 값 초기화가 가능한 새 멤버가 될 것으로 예상되는 경우. (C는 지정된 이니셜 라이저를 지원하며 멤버의 순서가 변경된 경우에도 탄력적입니다.) 불행하게도 C++에서는 이러한 이니셜 라이저가 없습니다.

또는 집계 초기화를 찾고 업데이트하는 데 문제가없는 경우. 집계를 변경할 때마다 이러한 가능성이 있음을 알아야합니다.

실제로 구성자는 사용자가 구성원을 변경하지 못하게하는 일종의 "구현 방화벽"을 제공합니다. 새 멤버와 같은 일부 변경 사항은 생성자에 대한 변경 내용을 프롬프트 할 수 있지만 생성자 인수가 누락되면 컴파일이 중단됩니다.

이렇게 "무질서한 구조체에 집계 초기화를 사용하지 마십시오"라는 무언의 규칙이 있습니까?

귀하와 내가 고려한 예외는 아닙니다. 또한 동 질적 다양성은 아무런 차이를 만들지 않습니다.

공개 API를 디자인 할 때 클래스의 레이아웃을 돌로 설정해야하는지 아니면 멤버를 비공개로 설정하고 생성자를 제공해야 하는지를 고려해야한다고 생각합니다. 내부 API의 경우 클래스의 모든 용도를 신속하게 처리 할 수 ​​있다면별로 중요하지 않습니다. -Wmissing-field-initializers (-Wextra으로 활성화) :


GCC는 당신이 설명하는 정확한 상황을 해결하는 경고 옵션이 있습니다. 회원 이니셜 라이저를 제공하더라도 모든 것을 초기화하지 않으면 경고 메시지가 생성됩니다.

+0

"회원들을 다시 주문하는 것과 같은 다른 변화는 더 확실히 종속 코드의 변경을 요구할 것입니다." 나는 실제로 주요 문제 인 x와 y를 재정렬하고있다. 아마도 z를 추가하는 것이 질문을 혼란스럽게 만들었을 것입니다. 질문을 수정하여 재정렬을 _only_ 언급하십시오. – JoeTaicoon

+0

@JoeTaicoon은 새 필드 추가에 관한 질문을 삭제하지 않습니다. 그건 내 답변의 일부가 쓸모 없게 만들 것입니다. 그러나 재정렬에 대한 수정 사항을 자유롭게 추가하십시오. 내 대답은 이미 두 경우 모두 다루고 있습니다. – user2079303

관련 문제