2011-09-10 5 views
0

행렬을 나타내는 클래스를 작성했으며 모두 산술 연산자를 무시합니다. 다음은 단항 마이너스 과부하의 예연산자 오버로드 및 개체에 대한 포인터, C++

RegMatrix.h :

const RegMatrix operator -(); 

RegMatrix.cpp

const RegMatrix RegMatrix::operator -() 
{ 
    RegMatrix newMatrix(*this); 
    newMatrix *= -1; 
    return newMatrix; 
} 

이 같은 스택에 객체를 생성 할 때 이제이 완벽하게 작동합니다 RegMatrix a(3,3,v) (v는 값의 벡터이며 중요하지 않음). 내가 (MAIN.CPP에서)이 같은 new 키워드를 사용하는 경우 :

RegMatrix* a = new RegMatrix(3,3,v); 
RegMatrix* b = -a; //<---ERROR HERE 

을 내가 왜 이런 일 wrong type argument to unary minus 어떤 아이디어를 얻을? 감사!

P. 또 다른 질문 : '='연산자가 자동으로 복사 생성자에 의해 무시됩니다.

+1

'operator ='는 복사 생성자가 _not_을 재정의했습니다. 너는 너 자신 그것을 무시해야한다. 그러나'= '연산자 _at 선언 _을 사용하면 복사 생성자가 호출됩니다. 다른 곳에서는'operator ='가 호출됩니다. –

+1

@Etienne de Martel :'operator ='는 ** overriden **이 아니지만 ** 과부하 **입니다. 표준에서는 특별히 ** overriden ** 함수에 ** virtual ** 키워드를 사용해야합니다. –

+0

@Als Wooops. 나는 항상이 두 용어를 혼동한다. –

답변

3

a의 유형은 RegMatrix *이고 RegMatrix이 아니라; a 포인트가있는 객체에 연산자를 적용하려면 a (*a)을 참조 해제하고 연산자에 적용한 다음 (-(*a)) 힙에 별도의 인스턴스를 원하면 새 인스턴스 사본을 만듭니다 new와 힙 및 복사 생성자 : @leftaroundabout 코멘트에서 지적

RegMatrix* a = new RegMatrix(3,3,v); 
RegMatrix* b = new RegMatrix(-(*a)); 

하지만,이 엄지 손가락의 규칙으로, 당신이 시도, C에서 작동 할 수있는 좋은 방법 ++ 아니다 가능하다면 동적 할당을 피하십시오 (메모리 누수를 원하지 않으면 속도가 느려지고 스마트 포인터가 필요합니다).

+2

C++에서는 보통이 방법을 사용하는 것이 좋지 않다고 언급 할 가치가 있습니다. – leftaroundabout

+0

@leftaroundabout : 예, 그것에 대해 줄을 추가하겠습니다. –