2012-10-10 15 views
-2

나는 게으름 뱅이를 보여 주며 모든 것을 저에게 보여주기 위해 실수를했습니다. 아래 코드에서 연산자 오버로딩에 대해 배우고 싶습니다. 이 코드는 메인 프로그램이 코드에서 연산자 오버로드가 어떻게 작동합니까?

static public explicit operator Int32(Vector v) 
     { 
      return v.Length; 
     } 

     public override string ToString() 
     { 
      String res = "<"; 
      for (int i = 0; i < elements.Length; i++) 
       res += " " + elements[i]; 
      res += " >"; 
      return res; 
     } 

     public override bool Equals(Object v) 
     { 
      return (this == (Vector)v); 
     } 

     public override int GetHashCode() 
     { 
      return base.GetHashCode(); 
     } 
    } 

코드에서 무엇을하고 있는지하는 것은 벡터와 평등/불평등 사업자의 덧셈, 뺄셈, 곱셈의 작업을 대체하여, 벡터의 클래스를 구현합니다. 하나의 피연산자 (실수 또는 정수) 연산을 고려하십시오. 연산에서 차원 벡터가 일치하는 경우 예외를 throw합니다.

namespace ConsoleApplication3 
{ 



    public class Vector 
    { 
     private Double[] elements; 

     public Vector() 
     { 
      this.elements = null; 
     } 

     public Vector(Int32 size) 
     { 
      if (size < 0) throw new Exception("Invalid vetors size");   
      elements = new Double[size]; 
     } 

     public Vector(params Double[] elements) 
     { 
      this.elements = elements; 
     } 

     public Vector(Vector v) 
     { 
      this.elements = v.elements; 
     } 

     public int Length 
     { 
      get 
      { 
       if (elements == null) return 0; 
       return elements.Length; 
      } 
     } 

     public Double this[int index] 
     { 
      get 
      { 
       return elements[index]; 
      } 
      set 
      { 
       elements[index] = value; 
      } 
     } 

     static public Vector operator+(Vector v1, Vector v2) 
     { 
      if (v1.Length != v2.Length) 
       throw new Exception("size of vectors are different"); 
      Vector res = new Vector(v1.Length); 
      for (int i = 0; i < res.Length; i++) 
       res[i] = v1[i] + v2[i]; 
      return res; 
     } 

     static public Vector operator+(Vector v, Double d) 
     { 
      Vector res = new Vector(v.Length); 
      for (int i = 0; i < v.Length; i++) 
       res[i] = v[i] + d; 
      return res; 
     } 

     static public Vector operator +(Double d, Vector v) 
     { 
      return (v + d); 
     } 

     static public Vector operator -(Vector v, Double d) 
     { 
      Vector res = new Vector(v.Length); 
      for (int i = 0; i < v.Length; i++) 
       res[i] = v[i] - d; 
      return res; 
     } 

     static public Vector operator -(Double d, Vector v) 
     { 
      Vector res = new Vector(v.Length); 
      for (int i = 0; i < v.Length; i++) 
       res[i] = d - v[i]; 
      return res; 
     } 

     static public Vector operator *(Vector v, Double d) 
     { 
      Vector res = new Vector(v.Length); 
      for (int i = 0; i < v.Length; i++) 
       res[i] = v[i] * d; 
      return res; 
     } 

     static public Vector operator *(Double d, Vector v) 
     { 
      return (v * d); 
     } 

     static public Vector operator -(Vector v1, Vector v2) 
     { 
      if (v1.Length != v2.Length) 
       throw new Exception("size of vectors are different"); 
      Vector res = new Vector(v1.Length); 
      for (int i = 0; i < res.Length; i++) 
       res[i] = v1[i] - v2[i]; 
      return res; 
     } 

     static public Vector operator *(Vector v1, Vector v2) 
     { 
      if (v1.Length != v2.Length) 
       throw new Exception("size of vectors are different"); 
      Vector res = new Vector(v1.Length); 
      for (int i = 0; i < res.Length; i++) 
       res[i] = v1[i] * v2[i]; 
      return res; 
     } 

     static public Boolean operator ==(Vector v1, Vector v2) 
     { 
      if (v1.Length != v2.Length) 
       return false;    
      for (int i = 0; i < v1.Length; i++) 
       if(v1[i] != v2[i]) return false; 
      return true; 
     } 

     static public Boolean operator !=(Vector v1, Vector v2) 
     { 
      return (!(v1 == v2)); 
     } 

     static public explicit operator Int32(Vector v) 
     { 
      return v.Length; 
     } 

     public override string ToString() 
     { 
      String res = "<"; 
      for (int i = 0; i < elements.Length; i++) 
       res += " " + elements[i]; 
      res += " >"; 
      return res; 
     } 

     public override bool Equals(Object v) 
     { 
      return (this == (Vector)v); 
     } 

     public override int GetHashCode() 
     { 
      return base.GetHashCode(); 
     } 
    } 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      Vector v1 = new Vector(new Double[]{1, 2, 3, 4}); 
      Vector v2 = new Vector(2, 3, 4, 5); 
      Console.WriteLine(v1 + " + " + v2 + " = " + (v1 + v2)); 
      Console.WriteLine(v1 + " - " + v2 + " = " + (v1 - v2)); 
      Console.WriteLine(v1 + " * " + v2 + " = " + (v1 * v2)); 
      Console.WriteLine(v1 + " * " + 7 + " = " + (v1 * 7)); 
      Console.ReadKey(true); 
     } 
    } 
} 
+2

무엇이 질문입니까? – Matthew

+0

이 코드에서 연산자 오버로드가 expecially 작동하는 방법 – user1722962

+5

@ user1722962 : 약 200 줄의 코드를 게시했습니다. 오페라 오버로딩이 혼란 스럽다는 것을 입증하는 * * * 예제를 게시하십시오. 또한 당신에게 혼란을주는 것을 정확히 말해주십시오. 그렇지 않으면이 질문은 대답하기에 너무 모호합니다. 아마도 문서에서 이미 읽었던 것과 같은 종류의 것을 쓸 것입니다. –

답변

1

C#에서 모든 항목은 개체이므로 모든 개체 클래스에 있습니다. 적어도 방법은 Object에서 inhered에서

http://msdn.microsoft.com/en-us/library/system.object.aspx

그래서 모든 객체는 것이다. ToString과 같은이 함수를 재정의하면 기본 클래스에서 사용할 수있는 함수의 구현이 구현으로 대체됩니다.

연산자는 동일한 상황이며 두 배열 (또는 사용자가 정의한 다른 유형)의 operator +도 존재하지 않으므로 구현자가 있어야합니다.

운영자 방법과 유사한 정적 공용 부울 연산자 == (벡터 V1, 벡터 V2)

필요 2 벡터 조항 및 부울 값 가 함께 (되지 구문)에 상당 반환 ( 부울 같음 벡터 v1, 벡터 v2)

나머지는 동일한 접근법.

도움이 되었기를 바랍니다.

2

약간의 코드 리뷰는 큰 빨간 깃발입니다.

이 생성자

은 위험 잘못 :

public Vector(Vector v) 
    { 
     this.elements = v.elements; 
    } 

elements는 (배열)에 대한 참조입니다 그래서 당신은 벡터 여기 객체 이 같은 요소가 있음 (2)를 만들 수 있습니다.

Vector v1 = new Vector(10); 
Vector v2 = new Vector(v1); // 2 vectors, 1 elements 

v1[0] = 1.2; 
Console.WriteLine(v2[0]); // prints 1.2 

그리고 이와 같은 이유로, 적어도 위험 :

public Vector(params Double[] elements) 
    { 
     this.elements = elements; 
    } 

이 2 (더 아마도 몇) 문제에 대한 해결책으로이 클래스를 설계를 다시하는 것 불변. 우선, 인덱서에서 세터를 제거하십시오. 실제로는 길이가,

static public explicit operator Int32(Vector v) 
    { 
     return v.Length; 
    } 

그것은 벡터가 어떻게 든 의 길이 것을 제안 :

이 연산자

가 매우 의심스러운 것입니다, 당신의 사용 사례 것입니다.

2

운영자 과부하는 매우 간단하며 제공된 코드를 기반으로 이해할 수 있습니다.

static public Vector operator *(Double d, Vector v) 
    { 
     return (v * d); 
    } 

당신이 무의미 운영자 자체와 * 연산자를 정의하고 아마로 더블 D를 곱하여 (어쨌든 작동하지 않습니다 : 당신이 여기에서 문제로 실행 될 수있다 여기에 예를 들어 있다는 것입니다 Vector v는 작동하지만 이미이 기능을 사용하고 있습니다.

함수를 이해하면 연산자는 두 개의 매개 변수로 동일한 작업을 수행하고 원하는 값을 반환합니다.

관련 문제