2016-10-26 3 views
-4

[] 연산자를 오버로드하려고합니다. 처리되지 않은 예외 오류가 발생합니다. vector<double>을 사용하여 매트릭스 클래스를 구현하려고합니다.연산자 오버로드 오버플로 연산자 오버플로

double& Matrix::operator[](int i) 
{ 
    return (*this)[i]; 
} 
+13

[고무 오리] (https://en.wikipedia.org/wiki/Rubber_duck_debugging) :'(* this) [i]'에게 무슨 일이 생기는지 설명하십시오. – juanchopanza

+0

재귀처럼 보입니다. – Archie

+0

행렬에 둘 이상의 차원이 있어야하지 않습니까? –

답변

2

(*this)Matrix 개체를 반환합니다. 따라서 (*this)[i]Matrix::operator[](i)으로 전화합니다. 함수는 다음과 같은 종료 조건없이 자체적으로 호출합니다.

int foo() { 
    return foo(); 
} 

여러분이 상상할 수있는 것처럼 아주 빨리 충돌합니다.

구성원 변수에서 std::vector::operator[]으로 전화를 걸 수도 있습니다. ,

double& Matrix::operator[](int i) 
{ 
    return this->vec[i]; 
} 

또한, this->member는 속기가 (*this).member 위해 더 자주 사용 : 클래스는, vec라는 개인 벡터 객체가있는 경우 예를 들어, 수행 할 수 있습니다!

1

(*this)[i]은 기능적으로 (*this).operator[](i)과 같습니다.

그러므로 Matrix::operator[](i)을 호출합니다. 그것은 연산자 함수 자체 내에서 발생하기 때문에 함수는 무조건 자체를 재귀 적으로 호출합니다. 즉, 일부 시스템에서는 시스템 예외가 발생하여 메모리가 고갈 될 때까지 자체 호출을 계속 유지합니다. Matrix 가정

은 아마 당신은 오히려 (*this)[i]보다 (벡터의 operator[]를 호출하는) that_member[i]를 사용할 필요가 입력 std::vector<double>의 회원이있다.