2017-02-22 63 views
0

Я думаю, это довольно простая проблема, но я не мог найти ответ.Перегрузка оператора мультиплексирования на векторный класс в C#

Программа сделана для учебных целей, я определил вектор класса с оператором умножения, как это:

public class vector 
{ 
    private int x; 
    private int y; 

    public vector(int x,int y) 
    { 
     this.x = x; 
     this.y = y; 
    } 
    public static vector operator *(vector w1, vector w2) 
    { 
     return int w1.x*w2.x + w1.y * w2.y; 
    } 
} 

Проблема заключается в том, что визуальная студия подчеркивает выражение в свою очередь, как я должен изменить определение Оператор «*», чтобы он работал?

+1

@ThomasD. Вы можете * абсолютно * перегрузить двоичный '*' оператор в C# (обратите внимание, что вы не переопределяете операторов, вы их перегружаете.) Вы не можете перегрузить * унарный * '*' оператор, но это не то, что перегружено здесь , – Servy

+0

@ Серви, ты совершенно прав. Приятно, я кое-что узнал сегодня. Спасибо что подметил это! –

+0

Я думаю, реальная проблема заключается в том, что умножение преобразует векторный объект класса в целое число, можно перегрузить оператор «*», я просто не могу найти способ вернуть туда int, и с этим мне нужна помощь. –

ответ

0

Вам необходимо вернуть новый экземпляр вектора, попробуйте следующее:

public class vector 
{ 
    private int x; 
    private int y; 

    public vector(int x, int y) 
    { 
     this.x = x; 
     this.y = y; 
    } 

    public static vector operator *(vector w1, vector w2) 
    { 
     return new vector(w1.x* w2.x, w1.y * w2.y); 
    } 
} 
+0

В этом проблема, вы не получаете вектор, если хотите получить скалярное умножение на 2 вектора, просто значение int (реально вообще), будет та же проблема, если я хочу получить абс комплексного числа. Это легко выполнимо в python, например: def __mul __ (self, second): return self.x * second.x + self.y * second.y –

+1

@RafalKonklewski Я вижу. Проверьте ответ Ксандера на получение целого числа. – Eric

1

Вы определили свою функцию, возвращающую vector, однако вы только возвращаете int.

public static vector operator *(vector w1, vector w2) 
{ 
    return int w1.x*w2.x + w1.y * w2.y; 
} 

должен быть

public static int operator *(vector w1, vector w2) 
{ 
    return int (w1.x*w2.x + w1.y * w2.y); 
} 

Или, например, если вы хотите, чтобы вернуть вектор для оператора сложения, который будет выглядеть так:

public static vector operator +(vector w1, vector w2) 
{ 
    return new vector (w1.x+w2.x, w1.y + w2.y); 
}