2013-10-31 4 views
1

수학 벡터의 다음 연산자를 오버로드하는 간단한 예제 프로그램을 찾으려고합니다.C++ 벡터 연산자 오버로드

Constructor // create 

= (equals)  // assign 

+; -; +=; -= // add sub 

*; /; *=; /= // multi divide 

++; -- // plus minus 

== // compare 
>; >= 
<; <= 

[] // access a value 

캔트는 훌륭한 간단한 튜토리얼을 찾은 것 같습니다. 나는이 물건을 지금 배우기 때문에 단순한 것을 강조한다. 예를 들어, 누군가가 나를 연결하거나 더 나은 프로그램을 작성하여 운영자 중 한 명에게 단순한 오버로드를 제공 할 수 있다면 놀라운 것입니다!

+0

"수학적 벡터"라고 할 때 실제 유형은 무엇입니까? –

+0

이렇게하면 되나요? http://www.cplusplus.com/doc/tutorial/classes2/ – JustinDanielson

+0

uni에서의 향후 연구에서 우리는 "수학적 벡터가 아닌 STL vector"를 사용할 것이라는 말을 들었습니다. 그래서 그들은 똑같은지 다른지 확실하지 않습니다. – SharpCode

답변

5

다른 기능과 함께 자주 사용되지 않는 연산자를 작성할 때 알아야 할 몇 가지 사항이 있습니다.

class v { 
public: 
    double x_, y_; 
    v& operator += (const v& rhs) 
    { 
    _x += rhs._x; 
    _y += rhs._y; 
    return *this; 
    } 
}; 

또 다른 흥미로운 하나, 사전 ++ 및 사후 ++ 때문 만이 사용되지 않은 다른 위치 :

할당 사업자

, 예를 들어,이 벡터의 값을 변경하기 때문에 *이 돌아갑니다 매개 변수 :

class v { 
public: 
    double x_, y_; 
    v& operator ++(); // ++v 
    v& operator ++ (int); // v++ 
}; 

"같음"(할당)은 포인터를 사용할 때 까다로운 또 다른 것입니다. 벡터의 경우, 일반적으로 문제가되지 않습니다,하지만 당신은 벡터 V를 정의하고 그 자체에 할당하는 경우, 당신은 조심해야 다음의 경우() 것입니다 확실히 귀하의 경우에는

class v { 
public: 
    double x_, y_; 
    v& operator = (const v& rhs) 
    { 
    if(this != &rhs) 
    { 
     x_ = rhs.x_; 
     y_ = rhs.y_; 
    } 
    } 
}; 

, 하지 유용하지만,이 같은 일을 생각 :

delete p_; 
    p_ = new foo; 
    p_->x_ = rhs.p_->x_; 

& 만약 우 ==이 다음 delete p_은 RHS는 포인터 삭제! 즉, 3 행에서 액세스하는 것은 버그입니다.

나머지는 쉽게 작업 할 수 있어야합니다. 비교 연산자는 bool을 반환하고 const입니다.

class v { 
public: 
    double x_, y_; 
    bool operator == (const v& rhs) const 
    { 
    return x_ == rhs.x_ && y_ == rhs.y_; 
    } 
}; 

[] 연산자 제외. 당신이 볼 수 있듯이

class v { 
public: 
    // I would imagine you'd use an array but as a simple example... 
    double x_, y_; 
    double operator [] (int idx) const 
    { 
    return idx == 0 ? x_ : y_; 
    } 
    v_ref operator [] (int idx) 
    { 
    v_ref v(this, idx); 
    return r; 
    } 
}; 

에서, [] 연산자의 상수가 아닌 버전에 대한 참조를 반환 : 하나의 두 가지 버전이 있습니다.

r[3] = 7.3; 

R [3] 참조가 다음 기준의 할당이 매개 변수로 7.3 호출되어 반환 : 당신이 뭔가를 쓸 수 있도록이 필요합니다.

class v_ref 
{ 
public: 
    v *p_; 
    int i_; 
    v_ref(v *p, int i) 
    : p_(p), i_(i) 
    { 
    } 
    operator = (double q) 
    { 
    // again, I suppose you'd use an array instead! 
    if(i_ == 0) 
    { 
     p_->x_ = q; 
    } 
    else 
    { 
     p_->y_ = q; 
    } 
    } 
}; 

... 당신이 주요 벡터 객체가 모든 참조 개체 전에 삭제됩니다 경우 알 수 있도록 몇 가지 보안, 벡터 포인터가 참조 카운터의 사용을 만들 수 원하는 또 다른 메모를 가정 : 나는 것 생성자가 double의 배열을 할당한다고 상상해보십시오 (또는 std :: vector type ...을 사용하십시오). new를 사용하는 경우 소멸자에서 삭제할 것을 잊지 마십시오. 대입 연산자의 if()가 매우 중요한 경우입니다.

+0

이 물건을 구현하기 위해 벡터 클래스 객체를 어떻게 만들 수 있습니까? – SharpCode

+1

@ user2495847 그럼'vector' 클래스도 아직 없습니까? 기본적인 C++ 클래스 자습서부터 시작해야 할 것 같습니다. – crashmstr

+0

@crashmstr 벡터 클래스 객체를 생성하라는 메시지가 나타납니다. 이렇게하면 벡터가 생성됩니다 ... 벡터 위에 표시된 코드를 사용하거나 ... myVector 클래스를 의미합니다 : std :: vector {. ..}; 말하자면? – SharpCode