2014-04-29 3 views
0
_3DTocka operator=(_3DTocka _3D){ 
     swap(*this, _3D); 
     return *this; 
    } 

//main() 
_3DTocka _3Dx1(5, 9, 2), _3Dx2(_3Dx1); // first one is using constructor, second one copy constuctor and they both have 5,9,2 
_3Dx1 = _3Dx2; 

_3DTocka는 클래스의 이름입니다. 코드는 컴파일이 실행이되면 다음 프로그램은 즉시 SIGSEGV 오류를 제공합니다 .. 그리고 IDE, 줄 167, 코드 move.h 간다 : (_Tp & __a, _Tp & __b)연산자 오버로드시 SIGSEGV 오류 =

답변

2

이것은 무한 재귀입니다. 기능 스왑()는 다음과 같이 작동

void swap(Type & a, Type & b) { 
    Type tmp = a; \ 
    a = b;   -> here it calls your operator= 
    b = tmp;  /
} 

당신이

this->a = _3D.a; 
this->b = _3d.b; 
... 

에 _3D에서 모든 수준의 부가 요소를 할당해야 아니면 memcpy(this, &_3D, sizeof(_3D))을 사용할 수 있지만, 클래스가 다른 개체를 포함하지 않는 경우에만 , 기본 유형 만 있습니다.

1

기능 swap 차례로 전화 스왑 사본 할당 연산자. 그래서 당신은 연산자의 재귀 호출을 얻을 것이다. 개체의 각 데이터 멤버를 스왑 할 클래스에 대해 자체 스왑 함수를 정의해야합니다.

+0

그래서 스왑 및 복사 생성자를 사용할 수 없습니까? 여기서 연산자를 과부하시키는 가장 좋은 방법은 기사를 읽는 중입니다. – user3402189

+0

@ user3402189 글을주의 깊게 읽어야한다고 생각합니다. –