Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Общие вопросы по программированию, компьютерный форум
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.11.2010, 23:12   #31
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Программисту логично, что b = b + 1 и b += 1 это одно и то же, а вот для компилятора это совершенно разные вещи. Можно конечно выражать += через оператор +, но тогда код будет далеко не самым оптимальным.
я думал сделать чтоб компиль видя b=b+5 компилировал как b+=5
Цитата:
Есть повод подумать над своей гениальной перегрузкой, чтобы и без дублирования и не зависеть от порядка переменных (в С++ а + b не всегда тождественно b + a, если a и b разных типов, т.к. будут использоваться разные варианты перегрузки +).
это и понятно.
в принципе можно решить, подобием иерархии классов, то есть по ней можно идти только вверх(при автоприведении в операторах), а при присваинии разрешить ход вниз, но хорош ли метод?
или же разрешить компилю менять слагаемые/множители местами согласно иерархии или наличию операторов(удобно например если класс A не знает о классе B(на уровне операторов) но класс B знает об A, а выражение такого A=A+B, правда код не очень оптимален выйдет, но работать будет(естественно если класс B имеет приведение к A))
Цитата:
Так что думайте над своим творением более тщательно, чтобы потом не пришлось баги фичами называть
я тему потому и создал, чтоб выслушать советы
в случае проблем или же спорных вариантов, буду просить совета, а то мало ли наделаю глупостей..
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.

Последний раз редактировалось Пепел Феникса; 13.11.2010 в 23:15.
Пепел Феникса вне форума Ответить с цитированием
Старый 14.11.2010, 10:16   #32
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
я думал сделать чтоб компиль видя b=b+5 компилировал как b+=5
Если в языке будет возможна перегрузка и + и +=, то это выльется в грабли. Перегрузка этих двух операторов может быть кардинально различаться, в итоге в коде мы запрашиваем одну реализацию, а компилятор подставляет другую. Пожалуй, так лучше не делать. Или же кардинально менять механизмы перегрузки операторов и делать не как в С++.
Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
в принципе можно решить, подобием иерархии классов, то есть по ней можно идти только вверх(при автоприведении в операторах), а при присваинии разрешить ход вниз, но хорош ли метод?
Не совсем понял как это спасёт от такой ситуации:
Код:
A operator + (A a, B b);
B operator + (B b, A a);
...
A a;
B b;
a = a + b; // Сработает
a = b + a; // Ошибка, т.к. b + a возвращает объект класса B
Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
или же разрешить компилю менять слагаемые/множители местами согласно иерархии или наличию операторов(удобно например если класс A не знает о классе B(на уровне операторов) но класс B знает об A, а выражение такого A=A+B, правда код не очень оптимален выйдет, но работать будет(естественно если класс B имеет приведение к A))
1. Не спасёт в случаях реализации перегрузки для обоих случаев порядка элементов, как в моём примере выше
2. Код будет запутан и трудночитаем. Программист не сможет так слёту сказать какой именно оператор и для какого класса вызовется в конкретном месте. Для поиска ошибок придётся больше анализировать, учитывая особенности компилятора.
Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
я тему потому и создал, чтоб выслушать советы
Ну тогда позволю себе высказать мнение (просто опишу в каком направлении я бы двигался, ни в коем случае это не совет, но может на что натолкнёт).
Так вот начнём издалека: вспомним, что все мы являемся пользователями ПК и используем всякие программы. Допустим, нужно создать документ (курсовую, к примеру). Текста много - значит используем Word (ну или Writer или как там его в Oo зовут). Пишем пишем, а потом бац... схему нужно нарисовать. Берём visio или еще какую программу и рисуем схему там. Потом эту схему сохраняем как картинку, вставляем в ворд,... а потом еще табличка сложная понадобится и придётся мучиться с ней в ворде или делать её отдельно в Excel'e... В итоге наш единый документ раскидан по разным файлам, распечатать одним кликом мы его не можем, вручную правим нумерацию страниц,... В итоге получаем несоответствие реального объекта (распечатанного единого курсовика) и виртуального его воплощения.
Теперь вернёмся к нашим операторам. Что есть + по идее? Математическая операция сложение, для которой существуют свои законы (перемена мест слагаемых и всё такое). Так же в математике есть свои правила сложения матриц, матрица + вектор,... Если брать С++, то каждый программист сам прописывает все эти правила (причём может это сделать неправильно, что-то не учесть, пропустить, или специально исказить, потому что ему так удобнее). Причем в некоторых случаях таки важен порядок слагаемых, а в некоторых - нет (матрица + вектор != вектор + матрица). Так же отдельный разговор тут с пользовательскими классами, т.к. там уже я обязан задавать правила сложения двух сотрудников, если вдруг такая глупость приспичит. Отдельный вопрос вообще в необходимость разрешения такого. Может стоит сделать + чисто математической штуковиной и позволять складывать только математические данные.
Я как программист хочу получить сумму двух матриц, но я не хочу, при использовании матриц из двух разных библиотек, вспоминать как это делается и реализовывать ради этого ручками оператор сложения (да ещё и в двух экземплярах).
Но вот как это сделать... Можно натыкать интерфейсы матрицы, целого числа, вещественного числа и, если кому нужно, пусть реализует эти интерфейсы и автоматом получает возможность краткой записи а = а + b. При этом реализация операторов будет на совести компилятора и запрещена для изменения. Можно забить и пусть все пишут неявные преобразования, чтобы втихую матрицы для сложения приводились к некоему базовому типу (это собственно возможно и в С++ и частенько используется, но если автор библиотеки об этом не позаботился, то приплыли и придётся городить огород).
В общем, я хочу больше думать над задачей (нужно ли мне вообще складывать матрицы?), чем над её реализации (а как бы мне их сложить лучше... у них и тип разный и размерность... как уж это там в математике делается...)
pu4koff вне форума Ответить с цитированием
Старый 14.11.2010, 12:31   #33
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Пожалуй, так лучше не делать. Или же кардинально менять механизмы перегрузки операторов и делать не как в С++.
есть мысль(спросоня возникла) что разрешить перегружать только +=, а + автоматический сделать(и с остальными по аналогии)
но на мой взгляд как то не оч, я прав?
Цитата:
1. Не спасёт в случаях реализации перегрузки для обоих случаев порядка элементов, как в моём примере выше
2. Код будет запутан и трудночитаем. Программист не сможет так слёту сказать какой именно оператор и для какого класса вызовется в конкретном месте. Для поиска ошибок придётся больше анализировать, учитывая особенности компилятора.
да вы правы.
Цитата:
Ну тогда позволю себе высказать мнение
...
мне это больше напомнило библиотеку классов.
хотя насчет интерфейсов...не знаю, помоему это как то ограничивает прогера всетаки..
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.

Последний раз редактировалось Пепел Феникса; 14.11.2010 в 12:34.
Пепел Феникса вне форума Ответить с цитированием
Старый 15.11.2010, 06:59   #34
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
хотя насчет интерфейсов...не знаю, помоему это как то ограничивает прогера всетаки..
Ваш язык должен иметь свою философию - обоснование использованных механизмов. Почему это ограничивает прогера? Люди придумавшие это знают об ограничении, но все равно используют данные механизмы. Почему? Нужна Вам эта перегрузка? Нужна, а зачем? Подумайте сначала над этими вопросами (и многими другими). На каждый подобный вопрос у Вас должен быть четкий и желательно предсказуемый ответ. То есть чтобы человек, изучая Ваш язык не задумывался - что это еще за едрены пассатижи? И самое главное - всегда мог найти ответ о целесообразности использования той или иной возможности. Мне кажется, что у автора языка варианта на тему "не знаю" быть не должно.
Цитата:
Хорошо поставленный вопрос это уже половина ответа.
Аналогично и для Вашего языка - желательно все проработать как можно больше (совсем все скорее всего не получится), чтобы потом не было двусмысленности из-за которой придется пожертвовать временем, скоростью, удобством и т.д.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика

Последний раз редактировалось Utkin; 15.11.2010 в 07:01.
Utkin вне форума Ответить с цитированием
Старый 22.11.2011, 17:24   #35
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Мне кажется, что у автора языка варианта на тему "не знаю" быть не должно.
тема для этого и создавалась.

вообще поразмыслив, подумал ограничения нужны.
точнее строгие правила.
но теперь надо немного обдумать правила.
думаю:
1)запретить перегружать одновременно и += и +, только что-то одно(второе реализуется автоматически)
2)логические операторы реализуются группами(группа минимум это == и !=(причем достаточно и одного, второй может быть дополнен автоматом), группа максимум это >=,<=,<,>,==,!=(аналогично дополнение пары))
3)наследование как в Джава и ДотНет(один родитель, множество реализаций интерфейса)
4)сборка мусора через подсчет ссылок(автомат, с возможностью освободить объект ранее(но компиль будет отслеживать обращение к пустому объекту))
5)концепция ссылок, чтото близкое к Obj-C, обращение в ноль выдаст исключение(данное поведение контролируемо), но обработчик по умолчанию его не покажет(игнор).
6)ссылки авто-обновляемы, то есть двухсторонняя связь объект-ссылка(ссылки), то есть ссылка автоматически начинает вести в ноль.
...(потом еще)

пока правда думаю что делать с базовыми типами.(их объектами делать то не нужно(в куче))
думаю сделать регулируемый оператор присваивания(или увеличение ссылки или копирование).(в зависимости от типа объекта)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 22.11.2011, 19:54   #36
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,690
По умолчанию

И того получился C# )))
По мне так, в C++ на сегодняшний день есть почти все.
Замечу что не хватает такой удобной штуки как delegate в C#. Уж очень не удобно реализовывать ссылки на методы классов, особенно когда методы разных классов имеют одинаковые сигнатуры, то тут одним typedef не обойтись, но хотелось бы.

И вообще хочу чтобы в C++ был тип типа =))) Ну т.е.
Type t(int);
t i = 0;
И я был бы счастлив )))
Kostia вне форума Ответить с цитированием
Старый 22.11.2011, 20:40   #37
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

Цитата:
И вообще хочу чтобы в C++ был тип типа =))) Ну т.е.
ЭЭЭ? А что мешает...
Код:
typedef int Type;
Или
Код:
int b;
decltype(b) a;
_-Re@l-_ вне форума Ответить с цитированием
Старый 23.11.2011, 09:11   #38
the_deer_one
Участник клуба
 
Аватар для the_deer_one
 
Регистрация: 04.04.2010
Сообщений: 1,554
По умолчанию

Пепел Феникса
Цитата:
то есть на моем компиле можно будет все так же писать С++ программы.
То-то фичи новых стандартов c++ в компиляторы годами не могут добавить. Был 0х, его всё не осиливают и не осиливают. И комитет его взял и переименовали в 11x.
the_deer_one вне форума Ответить с цитированием
Старый 23.11.2011, 11:53   #39
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
И того получился C# )))
шарп не компилируется в нативный код.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 23.11.2011, 12:03   #40
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
шарп не компилируется в нативный код.
Зато D компилируется
pu4koff вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
можно ли подобный текст перевести на человеческий язык? alexxx777 Помощь студентам 0 24.05.2010 19:56
Как создать вид подобный SolidWorks. KemanSR Общие вопросы C/C++ 6 04.05.2010 21:30
Добавить модуль в phpnuke-подобный движок Able2Know Фриланс 3 23.04.2010 16:29
В Access есть тип данных "Счетчик".Есть ли подобный тип данных в MS Sql Server 2000? An_ton SQL, базы данных 5 16.01.2009 17:55