2016-11-30 1 views
1

나는 슬라이스가 객체의 한 부분 만 수정하는 방법을 설명한 this answer을 읽었습니다. 나는 위험한 경우에 설명 된 슬라이싱 동작이 보장되는지 또는 정의되지 않았는지 궁금합니다.여러 개의 기본 클래스 중 하나에서 안정적으로 복사하기 위해 객체 조각화 사용

class Combined : public Data, public Handler 
{ 
    // no operator=() defined 
    // implements abstract and/or virtual methods from Handler 
    // methods access members from Data 
}; 

class Data 
{ 
    // no operator=() defined 
    // public members and public non-virtual methods only 
}; 

class Handler 
{ 
    // no operator=() defined 
    // contains abstract as well as virtual methods 
    // protected/private members 
}; 

내가 안정적으로 사용 목적 슬라이싱과 같은, CombinedData 부분을 할당 할 수 수 있습니다 :

// Declaration 
Data returnSomeDataFromSomewhere(); 

// real work starts here 
Combined usable_obj; 

Data& sliced_data = usable_obj; 
sliced_data = returnSomeDataFromSomewhere(); 

usable_obj.actOnData(); 

(I은 수정할 수 없습니다) 다음 클래스 구조를 감안할 때

또는 심지어

Combined usable_obj; 
usable_obj.initialise(); 
usable_obj = returnSomeDataFromSomewhere(); 
usable_obj.actOnData(); 

this question의 대답은 명시 적으로 Combined.Data::operator= (또는 Combined::Data::operator=?)을 호출하면 동일한 효과가 있음을 나타냅니다. 그것은 Data& 객체에 할당하는 것과 같습니다. 그러나 파생 클래스의 불변성을 파기하는 것에 대한주의는 혼란 스럽습니다.

슬라이스가 정의되지 않은 동작 일 경우, 임시 Data 개체를 만들고 공개적으로 각 개체를 개별적으로 복사 할 수 있지만 Data에 200 명의 구성원이있는 경우이를 수행하지 않아도됩니다.

그러나 슬라이스 동작이 보장된다면주의해야 할 함정이 있습니까?


편집는 : 더 operator=가없는 클래스에 제한을 추가했습니다.

+1

'Data & sliced_data = useful_obj;는 슬라이스하지 않습니다. 슬라이스하려면'Data sliced_data = useful_obj; '가 필요합니다. – NathanOliver

+0

@ NathanOliver 또한'operator ='를 전혀 호출하지 않습니다. 어느 쪽이 왼편이에요? 의무적 인 초기화 참조 선언입니다. 그러나 그 후 영업 이익은 그 이후의 라인을 언급하고 있다고 생각합니다. 나는 그것이'operator ='가 가상인지 여부에 달려 있다고 생각한다. –

+0

@ PeterA.Schneider'returnSomeDataFromSomewhere()'는'Data'를 반환하기 때문에 참조가 참조하는'Combined'의 데이터 부분을 변경하려고합니다. – NathanOliver

답변

1

나는 뛰어 내릴 것이다.

우선 설명에 설명 된대로이 슬라이스가 아닙니다.

이것은 단순히 기본 클래스에 정의 된 함수를 호출하는 것입니다. 특별한 기능이지만, (마법과 관련 없음)이 아닌 이 아닙니다. 기본 구현은 오른쪽에있는 객체의 멤버 (operator=의 인수)를 멤버 함수가 호출되는 객체의 해당 멤버 (왼쪽)에 복사하는 것입니다. 내가 알 수있는 한, 이는 언어별로 안전해야합니다. (물론 호출자의 부분적인 변경은 Combined의 불변 값을 위반하기 때문에 논리적으로 문제가 될 수 있습니다.)

+0

나는 많이 깨달았습니다. 통찰력으로 뒷받침되는 다른 시각을 갖는 것은 놀라운 것입니다. =) 저는 이것을 하루 또는 이틀 더 열어 두겠습니다. 그러나 당신이 진드기를 느끼는 것처럼 보입니다. – aerobot

관련 문제