Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/3: Рейтинг темы: голосов - 3, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 20.05.2018
Сообщений: 3
1

Перегрузка оператора +

20.05.2018, 18:28. Показов 615. Ответов 9
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Привет форумчане!

Имеется следующий класс:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 
    public sealed class Point
        {
            private int x = 1;
            private int y = 2;
            private int z = 3;
            public string str;
 
            public static Point operator +(Point pnt1, Point pnt2)
            {
                Point result = new Point();
 
                result.x = pnt1.x + pnt2.x;
                result.y = pnt1.y + pnt2.y;
                result.z = pnt1.z + pnt2.z;
 
                return result;
            }
        }
Выполнив следующий код, мы затрём поле str в объекте pnt1:

C#
1
2
3
4
5
6
 
Point pnt1= new Point (); 
pnt1.str = "AZAZA!"; 
Point pnt2= new Point (); 
 
pnt1= pnt1+ pnt2;
Вопрос: можно ли избежать такой проблемы именно в контексте перегрузки оператора?

Спасибо.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.05.2018, 18:28
Ответы с готовыми решениями:

Перегрузка оператора >
хочу перегрузить оператор >, но не получается ... вот часть кода: public train Error = new...

Перегрузка оператора +
Есть три класса: HallValue, FilmValue, Session. В HallValue есть поле Start (в нем время начала...

Перегрузка оператора
public Set operator < (Set ob1, Set ob2) { if(ob1.len > ob2.len) return false; ...

Перегрузка оператора
Здравствуйте. У меня проблема, не могу сделать перегрузку оператора "!", надо подсчитать факториал...

9
TheGreatCornholio
1254 / 732 / 285
Регистрация: 30.07.2015
Сообщений: 2,408
20.05.2018, 18:33 2
А в чем проблема то? В том, что вы создаете новый объект и не инициализируете str?

C#
1
2
3
4
5
6
7
                Point result = new Point();
 
                result.x = pnt1.x + pnt2.x;
                result.y = pnt1.y + pnt2.y;
                result.z = pnt1.z + pnt2.z;
 
                return result;
0
0 / 0 / 0
Регистрация: 20.05.2018
Сообщений: 3
20.05.2018, 18:40  [ТС] 3
Woldemar89,

нет. Проблема в том, что нужно просуммировать координаты, и не трогать поле str
0
TheGreatCornholio
1254 / 732 / 285
Регистрация: 30.07.2015
Сообщений: 2,408
20.05.2018, 18:47 4
C#
1
2
3
4
5
6
7
8
9
                Point result = new Point(); //это новый объект!!!                
                
                result.x = pnt1.x + pnt2.x;
                result.y = pnt1.y + pnt2.y;
                result.z = pnt1.z + pnt2.z;
 
                result.str = pnt1.str; //и нужно просто инициализировать его поле соотв. значением
 
                return result;
0
0 / 0 / 0
Регистрация: 20.05.2018
Сообщений: 3
20.05.2018, 22:15  [ТС] 5
Woldemar89,

спасибо, я это понимаю Проблема в том, что мы можем и не знать во время выполнения, какой объект окажется по левую сторону присваивания (зависит от реализации). Отсюда и вытекает вопрос - как дать понять среде выполнения, что объекту слева (pnt1), при присвоении ему нового объекта (result), нужно заресетить только определенные поля (координаты)?

Пока концепция у меня только одна - скопировать в result объект pnt1, заресетить координаты у result и присвоить result объекту pnt1. Но как это делается в перегрузке оператора (не зная, какой объект по левую сторону присваивания), не хватает опыта придумать

В общем, жду наставлений на путь истинный.
Спасибо)
0
3560 / 2501 / 1174
Регистрация: 14.08.2016
Сообщений: 8,206
20.05.2018, 22:20 6
ну так продумай, как должно произойти при
1. у всех это поле пустое
2. только у какого-то одного заполнено
3. у обоих заполнено
0
5 / 5 / 5
Регистрация: 28.01.2017
Сообщений: 30
20.05.2018, 23:16 7
Цитата Сообщение от Just_Calm Посмотреть сообщение
Выполнив следующий код, мы затрём поле str в объекте pnt1:
Избежать затирания поможет "отличный" интерфейс IClonable который ты должен реализовать в классе Point, методом Clone() и выполнив return this.MemberwiseClone() . Затираться ничего не будет т.к мы режем риференс . А далее делай что хочешь и суммируй только координаты.
0
1 / 1 / 0
Регистрация: 01.11.2017
Сообщений: 58
21.05.2018, 02:52 8
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public static Point operator +(Point pnt1, Point pnt2)
            {
                if(pnt2==null&&pnt1!=null)
               {
                Point result = new Point();
 
                result.x = pnt1.x + pnt2.x;
                result.y = pnt1.y + pnt2.y;
                result.z = pnt1.z + pnt2.z;
                result.str=pnt1.str;
                return result;
                }
                 else
                {
                  return pnt2+pnt1;
                }
            }
0
672 / 475 / 215
Регистрация: 06.09.2013
Сообщений: 1,306
21.05.2018, 05:00 9
Цитата Сообщение от Just_Calm Посмотреть сообщение
Проблема в том, что мы можем и не знать во время выполнения, какой объект окажется по левую сторону присваивания (зависит от реализации). Отсюда и вытекает вопрос - как дать понять среде выполнения, что объекту слева (pnt1), при присвоении ему нового объекта (result), нужно заресетить только определенные поля (координаты)?
В реализации перегруженного оператора этого сделать не получится, при его использовании переменной слева от знака равенства присваивается вновь созданный объект, возвращаемый оператором, со своим полем str. Метод оператора знать не знает, чему присваивается возвращаемый им результат.
0
TheGreatCornholio
1254 / 732 / 285
Регистрация: 30.07.2015
Сообщений: 2,408
21.05.2018, 07:52 10
Цитата Сообщение от Just_Calm Посмотреть сообщение
В общем, жду наставлений на путь истинный.
Учите язык.
Цитата Сообщение от Just_Calm Посмотреть сообщение
при присвоении ему нового объекта
??
https://metanit.com/sharp/tutorial/2.16.php
0
21.05.2018, 07:52
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.05.2018, 07:52
Помогаю со студенческими работами здесь

Перегрузка оператора %
Здравствуйте! Уже задавала похожий вопрос. Как переопределить оператор %, для нахождения процента...

Перегрузка оператора <<
Здравствуйте, форумчане. Нужно в классе перегрузить оператор &lt;&lt;. Так не получается. В чем...

Перегрузка оператора
Здравствуйте! Есть класс Fraction(дробь), хочу перегрузить оператор + для массива таких дробей......

Перегрузка оператора ==
Вот код:public static bool operator ==(Tree LeftTree, Tree RightTree) { if (LeftTree== null...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru