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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Ze
3 / 3 / 0
Регистрация: 30.10.2010
Сообщений: 12
#1

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

27.09.2012, 12:29. Просмотров 673. Ответов 8
Метки нет (Все метки)

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

В зависимости от времени года "весна", "лето", "осень", "зима" определить погоду "тепло", "жарко", "холодно", "очень холодно" - C++
В зависимости от времени года "весна", "лето", "осень", "зима" определить погоду "тепло", "жарко", "холодно", "очень холодно". Я так...

У меня класс B в классе A, а в классе B рекурсивная функция переопределения оператора "()", как её вызвать, не создавая явно объект класса B? - C++
#include <windows.h> #include <iostream> using namespace std; //Вот главный класс class A{ public: A (){}; class...

C2678 бинарный ">>": не найден оператор, принимающий левый операнд типа "std::ostream" - C++
Код: #include <iostream> #include <memory> #include <typeinfo> #include <ctime> #include <windows.h> #include <ostream> ...

бинарный "++": "Counter" не определяет этот оператор или преобразование к типу приемлемо к встроенному - C++
бинарный "++": "Counter" не определяет этот оператор или преобразование к типу приемлемо к встроенному оператору #include <iostream> ...

Error C2678: бинарный ">>": не найден оператор, принимающий левый операнд типа "std::istream" - C++
Вот ошибка 1>------ Построение начато: проект: ыпошряоям, Конфигурация: Debug Win32 ------ 1> файл.cpp 1>c:\users\hp\desktop\уроки...

Error C2678: бинарный "<<": не найден оператор, принимающий левый операнд типа "std::ifstream" - C++
Собственно, текст ошибки приведен в названии темы. Сам код: #include &quot;stdafx.h&quot; #include &lt;conio.h&gt; #include &lt;iomanip&gt; #include...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
DU
1483 / 1059 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
27.09.2012, 13:19 #2
возможность перегружать операторы была введена для улучшения кода, если правильно это делать он действительно становится проще и понятнее.
некоторые операторы должны быть мемберами классов. это (), [], ->, =, оператор преобразования.
теперь представим, что скажем оператор скобки статический. какой синтаксим вызова будет для него? на сколько он лаконичен прост и понятен?

C++
1
2
3
4
Будет что-нибудь типа:
SomeClass::(arg1, arg2).
чем это лучше в сравнении этим:
SomeClass::Function(arg1, arg2)?
0
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 Посмотреть сообщение
хочет видеть статическим на этапе компиляции.
Пардон, имелось в виду "хочет видеть НЕ статическим".
0
OhMyGodSoLong
~ Эврика! ~
1243 / 992 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
27.09.2012, 15:53 #4
Операторы — это специальные функции, поэтому у них есть специальные ограничения.

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

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

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

Не по теме:

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

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

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

Добавлено через 1 час 27 минут
Да, моя версия такова:
Одна из причин того, что оператор присвоения реализуется только как член класса - дабы компилятор, прочтя определение данного типа, сразу мог определить, требуется ли автоматическое создание оператора присвоения или он определен программистом, в то время как операторы +=, *= и т.п. автоматически не создаются, а посему и проблемы такой нет.
Других причин столь необычного различия ваш покорный слуга пока не видит, возможно из-за некоторых пробелов в знаниях.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.09.2012, 20:13
Привет! Вот еще темы с ответами:

Бинарный ">>": не найден оператор, принимающий левый операнд типа "std::istream" - C++
Подскажите, пожалуйста, как решить проблему. Хочу перегрузить оператор ввода, но никак не пойму, в чем дело #include&lt;iostream&gt; ...

Error C2679: бинарный "<<": не найден оператор, принимающий правый операнд типа "std::string" (или приемлемое - C++
эмулятор работы банкомата Например #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;iomanip&gt; #include &lt;time.h&gt; #include...

Исправить ошибку:error C2678: бинарный ">>": не найден оператор, принимающий левый операнд типа "std::istream" - C++
Скажите пожалуйста, как исправить error C2678: бинарный &quot;&gt;&gt;&quot;: не найден оператор, принимающий левый операнд типа &quot;std::istream&quot; (или...

error C2678: бинарный ">>": не найден оператор, принимающий левый операнд типа "std::basic_istream<_Elem,_Traits>" - C++
Нужно из файла скачать информацию в объект. Почему у меня не получается? #include &lt;vector&gt; #include &lt;string&gt; #include &lt;iostream&gt; ...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
27.09.2012, 20:13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru