Форум программистов, компьютерный форум CyberForum.ru

Статический оператор "()" в классе - C++

Восстановить пароль Регистрация
 
Ze
3 / 3 / 0
Регистрация: 30.10.2010
Сообщений: 12
27.09.2012, 12:29     Статический оператор "()" в классе #1
Друзья, чем можно объяснить запрет на создание статического "operator ()" в классе?
Связано ли это как-то с его возможностью принимать разное количество параметров (насколько я помню, это же один оператор с таким свойством)?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.09.2012, 12:29     Статический оператор "()" в классе
Посмотрите здесь:

У меня класс B в классе A, а в классе B рекурсивная функция переопределения оператора "()", как её вызвать, не создавая явно объект класса B? C++
error C2678: бинарный ">>": не найден оператор, принимающий левый операнд типа "std::basic_istream<_Elem,_Traits>" C++
C++ Исправить ошибку:error C2678: бинарный ">>": не найден оператор, принимающий левый операнд типа "std::istream"
C++ Error C2678: бинарный ">>": не найден оператор, принимающий левый операнд типа "std::istream"
Error C2678: бинарный "<<": не найден оператор, принимающий левый операнд типа "std::ifstream" C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
27.09.2012, 13:19     Статический оператор "()" в классе #2
возможность перегружать операторы была введена для улучшения кода, если правильно это делать он действительно становится проще и понятнее.
некоторые операторы должны быть мемберами классов. это (), [], ->, =, оператор преобразования.
теперь представим, что скажем оператор скобки статический. какой синтаксим вызова будет для него? на сколько он лаконичен прост и понятен?

C++
1
2
3
4
Будет что-нибудь типа:
SomeClass::(arg1, arg2).
чем это лучше в сравнении этим:
SomeClass::Function(arg1, arg2)?
Ze
3 / 3 / 0
Регистрация: 30.10.2010
Сообщений: 12
27.09.2012, 15:12  [ТС]     Статический оператор "()" в классе #3
Сбил с толку редактор кода VC++.
Выражение
C++
1
2
3
4
struct Type
{
    static int operator ()(Type x, Type y);
};
уже в процессе ввода ругает, тогда как
C++
1
2
3
4
struct Type
{
    static int operator +(Type x, Type y);
};
хочет видеть статическим на этапе компиляции.
Что навело на мысль о том, что это ограничение только на оператор "()".

Добавлено через 16 минут
Также довольно занятно, что несмотря на то что конструкция вне класса вида
C++
1
Type operator =(Type x, Type y);
недопустима,
C++
1
Type operator +=(Type x, Type y);
вполне законна и работает.
Тоже интересно было бы понять причину.

Добавлено через 56 минут
Цитата Сообщение от Ze Посмотреть сообщение
хочет видеть статическим на этапе компиляции.
Пардон, имелось в виду "хочет видеть НЕ статическим".
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
27.09.2012, 15:53     Статический оператор "()" в классе #4
Операторы — это специальные функции, поэтому у них есть специальные ограничения.

Операторы определяются исключительно для объектов классов. Но могут определяться двояко: как метод объекта и как внешний метод. Метод объекта один из операндов (левый) получает неявно через this. Внешнему оба операнда передаются через аргументы.

Статическими они быть не могут. Оператор-метод должен быть нестатическим методом. Внешний оператор должен быть глобальной функцией.

И да, потому что они специальные, волею Господа присваивание нельзя определять внешней функцией. Точно так же нельзя определять [], ->, () и операторы-приведения. Потому что они не имеют смысла без указателя this — для них его надо обязательно передавать, а внешние операторы могут иметь любые типы операндов.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
27.09.2012, 16:08     Статический оператор "()" в классе #5
~OhMyGodSoLong~, Скорее волею Страуструпа все же, ну или волею комитета.)
OhMyGodSoLong
27.09.2012, 16:14
  #6

Не по теме:

Не упоминай имя Господа всуе. Чти Святые Писания Его. И ещё 14 заповедей :)

Ze
3 / 3 / 0
Регистрация: 30.10.2010
Сообщений: 12
27.09.2012, 16:27  [ТС]     Статический оператор "()" в классе #7
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
И да, потому что они специальные, волею Господа присваивание нельзя определять внешней функцией. Точно так же нельзя определять [], ->, () и операторы-приведения. Потому что они не имеют смысла без указателя this — для них его надо обязательно передавать, а внешние операторы могут иметь любые типы операндов.
Тут никто не спорит, занятно то, что "=" не может быть, как вы написали "глобальной функцией", а "+=" может.
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
27.09.2012, 17:00     Статический оператор "()" в классе #8
А, вы с философской точки зрения. Тут дело, думаю, в том, что присваивание не совсем явно используется много где. Поэтому очень желательно, чтобы оно гарантированно сохраняло свою семантику "присвоить значение какому-то lvalue". += не так часто используется и трактовать можно по разному, поэтому можно допустить всякие вольности.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.09.2012, 20:13     Статический оператор "()" в классе
Еще ссылки по теме:

Оператор "delete" и ошибка "_BLOCK_TYPE_IS_VALID(pHead->nBlockUse) Error" C++
Бинарный ">>": не найден оператор, принимающий левый операнд типа "std::istream" C++
Структура «Преподаватель» с полями "ФИО", "стаж", "категория", "нагрузка" C++

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

Или воспользуйтесь поиском по форуму:
Ze
3 / 3 / 0
Регистрация: 30.10.2010
Сообщений: 12
27.09.2012, 20:13  [ТС]     Статический оператор "()" в классе #9
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
А, вы с философской точки зрения.
Именно.
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
...присваивание не совсем явно используется много где. Поэтому очень желательно, чтобы оно гарантированно сохраняло свою семантику "присвоить значение какому-то lvalue". += не так часто используется и трактовать можно по разному, поэтому можно допустить всякие вольности.
Возможно именно поэтому, но все-таки идеологически, на мой взгляд, это операторы одной группы и логично было бы им иметь идентичные правила применения.

Добавлено через 1 час 37 минут
Может еще потому что оператор присвоения создается автоматически, даже если не определен вручную, а операторы серии "х=" таким свойством не обладают...

Добавлено через 1 час 27 минут
Да, моя версия такова:
Одна из причин того, что оператор присвоения реализуется только как член класса - дабы компилятор, прочтя определение данного типа, сразу мог определить, требуется ли автоматическое создание оператора присвоения или он определен программистом, в то время как операторы +=, *= и т.п. автоматически не создаются, а посему и проблемы такой нет.
Других причин столь необычного различия ваш покорный слуга пока не видит, возможно из-за некоторых пробелов в знаниях.
Yandex
Объявления
27.09.2012, 20:13     Статический оператор "()" в классе
Ответ Создать тему
Опции темы

Текущее время: 17:02. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru