2012-10-10 49 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(); 
     } 
    } 

代碼做實現類載體,通過重寫載體和平等/不平等的運營商的加法,減法,乘法的運算。考慮一個操作數的操作 - 實數或整數。在操作中維度向量重合的情況下拋出異常。

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

運營商超載如何在此代碼中特別工作 – user1722962

+5

@ user1722962:您已發佈近200行代碼。發佈一個*短*的例子,其中*只顯示運營商重載令人困惑。也請告訴我們它到底是什麼讓你感到困惑 - 否則這個問題太模糊不清,因爲我們可能會寫出類似於你已經閱讀過的文檔。 –

回答

1

在C#中,所有項目都是對象,因此所有inhere對象類。

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

因此,所有的物體都會有至少從方法的對象inhered。 如果您重寫ToString之類的任何函數,基類上可用函數的實現將被您的實現所取代。

對於運算符是相同的情況,此外operator +對於兩個數組(或者對於由您定義的其他類型)不存在,因此它們應該有您的實現。

算與方法類似 靜態公共布爾運算符==(矢量V1,矢量V2)

需要2矢量術語和返回一個布爾值 相當於(不在語法)帶有: 布爾等於( Vector v1,Vector 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個(也可能多了一些)問題的補救辦法是重新設計這個類是不可改變的。對於初學者,從索引器中移除setter。

這個操作符是非常可疑的,你有什麼用例:

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

它表明一個Vector莫名其妙是一個長度,實際上它只是具有的長度。

2

運算符重載非常簡單,根據提供的代碼,它看起來像你理解它。你可能運行到一個問題,這裏要說的是,例如這裏:

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

你定義與運營商本身,這是毫無意義的*運算,可能無論如何都不會工作(乘以一個雙d一個Vector v可以工作,但你已經使用了這個功能)。

如果你理解函數,運算符用兩個參數做同樣的事情並返回你想要的值。