Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
2 / 2 / 1
Регистрация: 22.06.2012
Сообщений: 244

Перегрузка бинарного плюса и преобразование

23.11.2012, 11:55. Показов 971. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Изучаю перегрузку операторов, наткнулся на странную вещь, которая не укладывается в голове.
Получилось все случайно: делал демокод по перегрузке, надо было проверить как работает перегрузка преобразования (приведения типов) в сочетании с перегрузкой плюса. Но скопировал не ту перегрузку, очень похожу. Все работает как надо, но...я обнаружил таки что не то скопировал и по идее это работать не должно! Сделал как задумывалось, но теперь работает неправильно! Помогите разобраться!

КОД:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
class PreOverloader
    {
        int x=10; 
        int y=20; 
        int z=30;
 
        // Отобразить состояние переменных
        public void Show()
        {
            Console.WriteLine("X = {0}, Y = {1}, Z = {2}\n", x, y, z);
        }
 
        // Неявное преобразование. В данном случае, объект текущего класса будет приведен к целочисленному значению.
        public static implicit operator int(PreOverloader Ob)
        {
            return Ob.x * Ob.y * Ob.z; // Возвращаем произведение трех координат
        }
 
        // ПРОБЛЕМА ЗДЕСЬ <----------------
        public static PreOverloader operator +(PreOverloader Ob1, PreOverloader Ob2)
        {
            PreOverloader Result = new PreOverloader();
 
            Result.x = Ob1.x + Ob2.x;
            Result.y = Ob1.y + Ob2.y;
            Result.z = Ob1.z + Ob2.z;
 
            return Result;
        }
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
class Program
    {
        static void Main(string[] args)
        {
            PreOverloader MyPre = new PreOverloader();
 
            int i; // Пустая переменная, которая возьмет в себя результат преобразования.
            i = MyPre; // Приводим объект к целочисленному значению! 
            Console.WriteLine("Преобразование прошло: "+ i);
 
            i = MyPre + 100; // То же самое, но с участием перегруженного плюса.
            Console.WriteLine("Преобразование прошло с участием плюса: " + i);
        }
Простое приведение работает нормально, дает нужный результат. Но когда плюсую к объекту MyPre нечто, все отлично, прибавляется столько сколько надо. НО! Посмотрите на перегрузку плюса! Аргументы ведь заданы неверно! Там значатся два аргумента и оба типа класса. Но второй аргумент ведь должен быть класса int ведь, чтобы все работало как надо, с соответствующими поправками кода.
То есть должно быть вот так:
C#
1
2
3
4
5
6
7
8
9
10
public static PreOverloader operator +(PreOverloader Ob1, int Ob2)
        {
            PreOverloader Result = new PreOverloader();
 
            Result.x = Ob1.x + Ob2;
            Result.y = Ob1.y + Ob2;
            Result.z = Ob1.z + Ob2;
 
            return Result;
        }
Но когда я записывал именно так, то при попытке что-то прибавить появлялось непонятное число, а совсем не то что нужно.

Вопросы:
1. Какого фига код работает при попытке сложения объекта с числом при первой записи?
2. Какого фига он работает не так как надо, при нужных аргументах?
3. Я что-то неверно понял в перегрузках операторов?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
23.11.2012, 11:55
Ответы с готовыми решениями:

Перегрузка бинарного плюса
Помогите пожалуйста исправить программу, есть класс, для его объектов(строкового типа) нужно перегрузить бинарную операцию плюс, в моей...

Перегрузка бинарного плюса
Ребят, есть перегрузка плюса, написанная для стека. стек реализован в виде массива(это не столь важно) template &lt;class Type1&gt; ...

Перегрузка бинарного оператора +
Добрый вечер! В последнее время мне не удаётся перегрузить оператор +, чтобы он поэлементно складывал одномерные массивы двух классов. ...

5
 Аватар для buntar
543 / 544 / 181
Регистрация: 16.03.2012
Сообщений: 1,160
Записей в блоге: 2
23.11.2012, 12:13
C#
1
2
3
4
5
6
7
8
9
//i = MyPre1 + 100; после сложения MyPre1 + 100 происходит преобразование в инт,
// т.к. i целочисленного типа 
// надо  писать:
PreOverloader q;
q = MyPre1 + 100;
q.Show();
// либо так:
//MyPre1+=100;
//MyPre1.Show();
C#
1
2
3
4
// для public static PreOverloader operator +(PreOverloader Ob1, PreOverloader Ob2)
PreOverloader qw = MyPre1 + MyPre2;
Console.WriteLine("MyPre1 + MyPre2: ");
qw.Show();
Добавлено через 1 минуту
Цитата Сообщение от Void-87 Посмотреть сообщение
Я что-то неверно понял в перегрузках операторов?
Скорее всего.
0
 Аватар для Spectral-Owl
608 / 583 / 157
Регистрация: 29.06.2010
Сообщений: 1,620
23.11.2012, 12:16
Цитата Сообщение от Void-87 Посмотреть сообщение
C#
1
2
3
4
5
6
7
8
9
// ПРОБЛЕМА ЗДЕСЬ <---------------- 
public static PreOverloader operator +(PreOverloader Ob1, PreOverloader Ob2) 
{ 
PreOverloader Result = new PreOverloader(); 
Result.x = Ob1.x + Ob2.x; 
Result.y = Ob1.y + Ob2.y;
Result.z = Ob1.z + Ob2.z; 
return Result; 
}
данный кусок в первом случае можно удалить совсем, т.к. после разрешения в классе неявного преобразования твоего класса в int, в данный кусок кода программа даже не заходит.

просто переводит MyPre в int, а потом самым банальным образом складывает два целочисленных значения.

по поводу непонятных цифр: итоговое значение сложения твоего класса (10,20,30) и целочисленной (100) выдаёт 1716000

само сложение происходит так что сначала вычисляется твой объект с координатами (110,120,130), а потом преобразуется в инт путём перемножения этих координат.
110*120*130=1716000.
по моему всё правильно.
1
2 / 2 / 1
Регистрация: 22.06.2012
Сообщений: 244
23.11.2012, 12:16  [ТС]
Цитата Сообщение от buntar Посмотреть сообщение
C#
1
2
3
4
5
6
//i = MyPre1 + 100; после сложения MyPre1 + 100 происходит преобразование в инт,
// т.к. i целочисленного типа 
// надо  писать:
PreOverloader q;
q = MyPre1 + 100;
q.Show();
Так мне-то нужно чтобы i было целочисленным, а не создавать новый объект типа PreOverloader. Я просто хочу привести объект к целочисленному.
0
 Аватар для buntar
543 / 544 / 181
Регистрация: 16.03.2012
Сообщений: 1,160
Записей в блоге: 2
23.11.2012, 12:20
Цитата Сообщение от Void-87 Посмотреть сообщение
Так мне-то нужно чтобы i было целочисленным, а не создавать новый объект типа PreOverloader.
У вас результат и так был целочисленным, только наверное вас результат смущал. Почему такой результат - выше объяснил Spectral-Owl .
1
2 / 2 / 1
Регистрация: 22.06.2012
Сообщений: 244
23.11.2012, 12:54  [ТС]
Цитата Сообщение от Spectral-Owl Посмотреть сообщение
данный кусок в первом случае можно удалить совсем, т.к. после разрешения в классе неявного преобразования твоего класса в int, в данный кусок кода программа даже не заходит.
У меня была такая же версия, ибо логично же, ведь ситуация описанная в перегрузке не соответствует выражению MyPre+100. Меня просто очень смутило, что не вылетела ошибка!

Цитата Сообщение от Spectral-Owl Посмотреть сообщение
просто переводит MyPre в int, а потом самым банальным образом складывает два целочисленных значения.
Вот где крылось непонимание. Я считал, что алгоритм выполнения этого выражения другой совсем, считал, что приведение типа происходит после выполнения всех операций после знака равенства.
Это вроде стандарт, нет? Или, поскольку мы описали только неявное приведение типа, то компилятор как бы по умолчанию считает данный объект целочисленным и приводит его сразу после того как объект появился?

Большое спасибо, вы уже очень помогли =)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
23.11.2012, 12:54
Помогаю со студенческими работами здесь

Перегрузка бинарного оператора
Хочу чтобы в моей программе знак &quot;%&quot; работал, как знак операция сложения действительных чисел &quot;+&quot;. Где ошибка #include...

Перегрузка бинарного оператора
Доброго времени суток всем, у меня возник такой вопрос - в чём моя ошибка. Компилятор ругается, мол &quot;Ошибка C3867...

Перегрузка бинарного оператора +
Выдает ошибку: Ошибка 2 error LNK1120: неразрешенных внешних элементов: 1 Main\Debug\Main.exe 1 Ошибка 1 error LNK2019: ссылка на...

Перегрузка бинарного оператора << в template классе
Помогите пожалйста люди! не получается перегрузить оператор &gt;&gt; и &lt;&lt; в шаблонном классе выдает ошибку: error C2804: бинарный 'operator...

Перегрузка бинарного -, ошибка: undefined reference to operator -(.)
Никак не могу понять, в чём же ошибка Вот класс: class tDoubleString { public: char* str; size_t number_symvols; ...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru