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

operator+ как член класса - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.80
broDiaga_cpp
 Аватар для broDiaga_cpp
19 / 9 / 1
Регистрация: 20.02.2010
Сообщений: 180
14.08.2013, 20:15     operator+ как член класса #1
Могу ли я сделать operator+ как член класса таким образом?
C++
1
2
3
4
5
myClass& myClass::operator+(const myClass& other1, const myClass& other2)
{
    data += other.data;
    return *this;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6173 / 2902 / 284
Регистрация: 04.12.2011
Сообщений: 7,729
Записей в блоге: 3
14.08.2013, 20:26     operator+ как член класса #2
Бинарный оператор принимает один параметр если он член класса.
Kins
 Аватар для Kins
59 / 58 / 6
Регистрация: 03.02.2013
Сообщений: 167
14.08.2013, 20:28     operator+ как член класса #3
Цитата Сообщение от IGPIGP Посмотреть сообщение
Бинарный оператор принимает один параметр если он член класса.
может я конечно и парю, давно читал про дружественные ф-ии, у дружественной ф-ии два аргумента. Первый вызывает, второй как аргумент.
Бендерродригез
Сгибальщик
 Аватар для Бендерродригез
42 / 42 / 3
Регистрация: 18.05.2013
Сообщений: 220
Завершенные тесты: 1
14.08.2013, 20:42     operator+ как член класса #4
Цитата Сообщение от Kins Посмотреть сообщение
может я конечно и парю, давно читал про дружественные ф-ии, у дружественной ф-ии два аргумента. Первый вызывает, второй как аргумент.
Таки на то она и дружественная.
broDiaga_cpp
 Аватар для broDiaga_cpp
19 / 9 / 1
Регистрация: 20.02.2010
Сообщений: 180
14.08.2013, 20:45  [ТС]     operator+ как член класса #5
Kins, дружественные функции, насколько мне известно, не являются членами класса.
IGPIGP, т.е. я не могу сделать оператор, являющийся членом класса, принимающий два параметра? Получается, я уже не смогу написать c = a + b ? Придётся обязательно менять данные класса a?
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6173 / 2902 / 284
Регистрация: 04.12.2011
Сообщений: 7,729
Записей в блоге: 3
14.08.2013, 20:51     operator+ как член класса #6
Цитата Сообщение от broDiaga_cpp Посмотреть сообщение
IGPIGP, т.е. я не могу сделать оператор, являющийся членом класса, принимающий два параметра? Получается, я уже не смогу написать c = a + b ? Придётся обязательно менять данные класса a?
Вы можете объявить дружественную функцию-оператор "+". Она примет 2 параметра (две константные ссылки, например) и вернёт ссылку. Но она не будет членом класса. В классе имеет смысл определить оператор "+=", если это нужно.
Ну или делайте с одним параметром, зачем именно с двумя?
VLK
 Аватар для VLK
192 / 161 / 12
Регистрация: 05.05.2013
Сообщений: 1,221
14.08.2013, 20:54     operator+ как член класса #7
1. как уже было сказано operator+ будет принимать только один параметр т.е.
C++
1
myClass& myClass::operator+(const myClass& other)
2. строчка
C++
1
data += other.data;
data как я понимаю переменная типа int и она должна быть private, а из этого следует, что тут возникнет ошибка т.к. один объект пытается получить доступ к закрытым данным другого объекта, т.е. надо использовать методы доступа
C++
1
2
int get_data() const
{ return data; }
C++
1
data += other.get_data();
Kins
 Аватар для Kins
59 / 58 / 6
Регистрация: 03.02.2013
Сообщений: 167
14.08.2013, 20:57     operator+ как член класса #8
Цитата Сообщение от broDiaga_cpp Посмотреть сообщение
дружественные функции, насколько мне известно, не являются членами класса.
объявляются то они в классе. а определяются вне.
broDiaga_cpp
 Аватар для broDiaga_cpp
19 / 9 / 1
Регистрация: 20.02.2010
Сообщений: 180
14.08.2013, 21:02  [ТС]     operator+ как член класса #9
Цитата Сообщение от Kins Посмотреть сообщение
объявляются то они в классе.
Но членами класса не являются.

Хорошо, если нельзя обойтись при перегрузке оператора + без дружественных функций, можно ли объявить функцию add, например:
C++
1
myClass& myClass::add(const myClass& other1, const myClass& other2);
Просто целью для меня является обойтись без дружественных функций. Не важно зачем. Задача такая.
И не хотелось бы менять a и b в выражении c = a + b.
VLK
 Аватар для VLK
192 / 161 / 12
Регистрация: 05.05.2013
Сообщений: 1,221
14.08.2013, 21:05     operator+ как член класса #10
Цитата Сообщение от broDiaga_cpp Посмотреть сообщение
можно ли объявить функцию add
Да, можешь, это же С++

что эта функция конкретно должна делать?
icpu
 Аватар для icpu
276 / 181 / 36
Регистрация: 10.03.2011
Сообщений: 863
Записей в блоге: 2
14.08.2013, 21:19     operator+ как член класса #11
Оператор - член класса принимает только один параметр. Причина тому проста: второй параметр - ссылку на сам класс - он получает неявно. то есть кусок кода
C++
1
2
3
4
5
myClass& myClass::operator+=(const myClass& other)
{
    this->data += other.data;
    return *this;
}
эквивалентен дружественной функции
C++
1
2
3
4
5
6
7
8
9
class myClass {
///...
friend myClass& operator+=(myClass& other1, const myClass& other2);
};
myClass& operator+=(myClass& other1, const myClass& other2)
{
    other1.data += other2.data;
    return other1;
}
в точности до интерфейса. Однако, многие авторы советуют такие операторы делать членами класса.
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
14.08.2013, 22:52     operator+ как член класса #12
Цитата Сообщение от broDiaga_cpp Посмотреть сообщение
Просто целью для меня является обойтись без дружественных функций. Не важно зачем. Задача такая.
ну так и делай оператор свободной функцией
C++
1
2
3
4
5
myClass operator + (const myClass& a, const myClass& b)
{
    myClass c(a);
    return c += b;
}
Добавлено через 1 минуту
Цитата Сообщение от broDiaga_cpp Посмотреть сообщение
C++
1
2
3
4
myClass& myClass::operator+
...
data += other.data;
...
гореть тебе в аду за такое
icpu
 Аватар для icpu
276 / 181 / 36
Регистрация: 10.03.2011
Сообщений: 863
Записей в блоге: 2
14.08.2013, 23:08     operator+ как член класса #13
Цитата Сообщение от Jupiter Посмотреть сообщение
ну так и делай оператор свободной функцией
C++
1
2
3
4
myClass operator + (const myClass& a, const myClass& b){
    myClass c(a);
    return c += b;
}
код плодит лишний экземпляр класса. Плюс, класс может не иметь такой конструктор, да и вообще какое-либо приравнивание. Плюс, нельзя унаследовать эту функцию, а вызывать только через касты. Говно, короче, а не предложение.

Не по теме:

Цитата Сообщение от Jupiter Посмотреть сообщение
гореть тебе в аду за такое
Если хочет и если это оправдано, пусть хоть запятую перегружает, не нам его судить. может, он делает интерпретатор машины Тьюринга или какую-нибудь другую бубуйню, в которой z++=+-,!!=+(==(-b+)) будет иметь особый смысл

Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
14.08.2013, 23:20     operator+ как член класса #14
Цитата Сообщение от icpu Посмотреть сообщение
код плодит лишний экземпляр класса
а на кой тогда оператор + если не сохранять результат

Цитата Сообщение от icpu Посмотреть сообщение
Плюс, класс может не иметь такой конструктор, да и вообще какое-либо приравнивание. Плюс, нельзя унаследовать эту функцию, а вызывать только через касты
встречный ответ:
Цитата Сообщение от icpu Посмотреть сообщение
может, он делает интерпретатор машины Тьюринга или какую-нибудь другую бубуйню, в которой z++=+-,!!=+(==(-b+)) будет иметь особый смысл
icpu
 Аватар для icpu
276 / 181 / 36
Регистрация: 10.03.2011
Сообщений: 863
Записей в блоге: 2
15.08.2013, 00:19     operator+ как член класса #15
Цитата Сообщение от Jupiter Посмотреть сообщение
а на кой тогда оператор + если не сохранять результат
Важно, как... Плюс, я уже написал, что operator может использоваться для краткости записи совсем иных действий, нежели простое суммирование.
Цитата Сообщение от Jupiter Посмотреть сообщение
встречный ответ
А что, машина Тьюринга не имеет права наследовать операторы? От детерменированой к недетерменированной? Что за расизм?!
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
15.08.2013, 00:20     operator+ как член класса #16
Цитата Сообщение от icpu Посмотреть сообщение
Важно, как..
что как?
icpu
 Аватар для icpu
276 / 181 / 36
Регистрация: 10.03.2011
Сообщений: 863
Записей в блоге: 2
15.08.2013, 00:21     operator+ как член класса #17
Цитата Сообщение от Jupiter Посмотреть сообщение
что как?
Ладно, я затупил. И так, и сяк создаётся экземпляр класса, разницы нет. Ну, разыгрался у меня сегодня синдром паладина, что поделать?
Tulosba
15.08.2013, 12:32
  #18

Не по теме:

кстати, operator+ может быть еще и унарным. А чтобы не гореть в адах, надо функции-члены, которые не должны менять this, делать константными.

IGPIGP
15.08.2013, 14:54
  #19

Не по теме:

Tulosba, вопрос в постановке нерешаем даже за пределами класса. Все же ссылки и две const))
Как говорил кот Матроскин: - "Чтобы вернуть что нибудь ненужное нужно сначала получить что нибудь ненужное."
Можно опрератор сравнения перегрузить. Чтобы наконец можно таки было написать что то вроде:

C++
1
A=B>C>D>E;

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.08.2013, 15:00     operator+ как член класса
Еще ссылки по теме:

Массив объектов класса как член другого класса C++
C++ Массив как член класса
Ifstream& как член класса C++

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

Или воспользуйтесь поиском по форуму:
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
15.08.2013, 15:00     operator+ как член класса #20
Цитата Сообщение от IGPIGP Посмотреть сообщение
вопрос в постановке нерешаем даже за пределами класса
Вопрос решаем. Ответ: "нет"
Цитата Сообщение от IGPIGP Посмотреть сообщение
Всё же ссылки и две const))
Речь о модификации this функцией, которая модифицировать не должна. Не о явных аргументах речь, а о неявном.
Цитата Сообщение от IGPIGP Посмотреть сообщение
C++
1
A=B>C>D>E;
И что в этом случае хотелось бы получить?
Yandex
Объявления
15.08.2013, 15:00     operator+ как член класса
Ответ Создать тему
Опции темы

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