나는 슬라이스가 객체의 한 부분 만 수정하는 방법을 설명한 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
};
내가 안정적으로 사용 목적 슬라이싱과 같은, Combined
만 Data
부분을 할당 할 수 수 있습니다 :
// 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=
가없는 클래스에 제한을 추가했습니다.
'Data & sliced_data = useful_obj;는 슬라이스하지 않습니다. 슬라이스하려면'Data sliced_data = useful_obj; '가 필요합니다. – NathanOliver
@ NathanOliver 또한'operator ='를 전혀 호출하지 않습니다. 어느 쪽이 왼편이에요? 의무적 인 초기화 참조 선언입니다. 그러나 그 후 영업 이익은 그 이후의 라인을 언급하고 있다고 생각합니다. 나는 그것이'operator ='가 가상인지 여부에 달려 있다고 생각한다. –
@ PeterA.Schneider'returnSomeDataFromSomewhere()'는'Data'를 반환하기 때문에 참조가 참조하는'Combined'의 데이터 부분을 변경하려고합니다. – NathanOliver