Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.92/13: Рейтинг темы: голосов - 13, средняя оценка - 4.92
24 / 14 / 2
Регистрация: 20.02.2010
Сообщений: 181
1

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

14.08.2013, 20:15. Показов 2728. Ответов 42
Метки нет (Все метки)

Могу ли я сделать operator+ как член класса таким образом?
C++
1
2
3
4
5
myClass& myClass::operator+(const myClass& other1, const myClass& other2)
{
    data += other.data;
    return *this;
}
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.08.2013, 20:15
Ответы с готовыми решениями:

Массив объектов класса как член другого класса
Здравствуйте. У меня тут возникла проблемка #include "main.h" class player { public: ...

Член-ссылка на другой член класса
Есть класс Dot с двумя членами - x и y. Требуется еще один класс, который хранит width i height, но...

Как перенести operator из базового класса в производный?
Добрый день! Подскажите, пожалуйста, на простых примерах, как нужно работать с оператором...

Предикат как член класса
Напомните пожалуйста Reference to non-static member function must be called std::count_if...

42
Комп_Оратор)
Эксперт по математике/физике
8719 / 4428 / 598
Регистрация: 04.12.2011
Сообщений: 13,275
Записей в блоге: 16
14.08.2013, 20:26 2
Бинарный оператор принимает один параметр если он член класса.
0
59 / 58 / 7
Регистрация: 03.02.2013
Сообщений: 167
14.08.2013, 20:28 3
Цитата Сообщение от IGPIGP Посмотреть сообщение
Бинарный оператор принимает один параметр если он член класса.
может я конечно и парю, давно читал про дружественные ф-ии, у дружественной ф-ии два аргумента. Первый вызывает, второй как аргумент.
0
Сгибальщик
42 / 42 / 4
Регистрация: 18.05.2013
Сообщений: 220
14.08.2013, 20:42 4
Цитата Сообщение от Kins Посмотреть сообщение
может я конечно и парю, давно читал про дружественные ф-ии, у дружественной ф-ии два аргумента. Первый вызывает, второй как аргумент.
Таки на то она и дружественная.
0
24 / 14 / 2
Регистрация: 20.02.2010
Сообщений: 181
14.08.2013, 20:45  [ТС] 5
Kins, дружественные функции, насколько мне известно, не являются членами класса.
IGPIGP, т.е. я не могу сделать оператор, являющийся членом класса, принимающий два параметра? Получается, я уже не смогу написать c = a + b ? Придётся обязательно менять данные класса a?
0
Комп_Оратор)
Эксперт по математике/физике
8719 / 4428 / 598
Регистрация: 04.12.2011
Сообщений: 13,275
Записей в блоге: 16
14.08.2013, 20:51 6
Цитата Сообщение от broDiaga_cpp Посмотреть сообщение
IGPIGP, т.е. я не могу сделать оператор, являющийся членом класса, принимающий два параметра? Получается, я уже не смогу написать c = a + b ? Придётся обязательно менять данные класса a?
Вы можете объявить дружественную функцию-оператор "+". Она примет 2 параметра (две константные ссылки, например) и вернёт ссылку. Но она не будет членом класса. В классе имеет смысл определить оператор "+=", если это нужно.
Ну или делайте с одним параметром, зачем именно с двумя?
0
197 / 166 / 19
Регистрация: 05.05.2013
Сообщений: 1,228
14.08.2013, 20:54 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();
0
59 / 58 / 7
Регистрация: 03.02.2013
Сообщений: 167
14.08.2013, 20:57 8
Цитата Сообщение от broDiaga_cpp Посмотреть сообщение
дружественные функции, насколько мне известно, не являются членами класса.
объявляются то они в классе. а определяются вне.
0
24 / 14 / 2
Регистрация: 20.02.2010
Сообщений: 181
14.08.2013, 21:02  [ТС] 9
Цитата Сообщение от Kins Посмотреть сообщение
объявляются то они в классе.
Но членами класса не являются.

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

что эта функция конкретно должна делать?
0
487 / 365 / 94
Регистрация: 10.03.2011
Сообщений: 1,513
Записей в блоге: 5
14.08.2013, 21:19 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;
}
в точности до интерфейса. Однако, многие авторы советуют такие операторы делать членами класса.
1
Каратель
Эксперт С++
6601 / 4020 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
14.08.2013, 22:52 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;
...
гореть тебе в аду за такое
1
487 / 365 / 94
Регистрация: 10.03.2011
Сообщений: 1,513
Записей в блоге: 5
14.08.2013, 23:08 13
Цитата Сообщение от Jupiter Посмотреть сообщение
ну так и делай оператор свободной функцией
C++
1
2
3
4
myClass operator + (const myClass& a, const myClass& b){
    myClass c(a);
    return c += b;
}
код плодит лишний экземпляр класса. Плюс, класс может не иметь такой конструктор, да и вообще какое-либо приравнивание. Плюс, нельзя унаследовать эту функцию, а вызывать только через касты. Говно, короче, а не предложение.

Не по теме:

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

0
Каратель
Эксперт С++
6601 / 4020 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
14.08.2013, 23:20 14
Цитата Сообщение от icpu Посмотреть сообщение
код плодит лишний экземпляр класса
а на кой тогда оператор + если не сохранять результат

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

Не по теме:

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

0
IGPIGP
15.08.2013, 14:54
  #19

Не по теме:

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

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

0
:)
Эксперт С++
4769 / 3263 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
15.08.2013, 15:00 20
Цитата Сообщение от IGPIGP Посмотреть сообщение
вопрос в постановке нерешаем даже за пределами класса
Вопрос решаем. Ответ: "нет"
Цитата Сообщение от IGPIGP Посмотреть сообщение
Всё же ссылки и две const))
Речь о модификации this функцией, которая модифицировать не должна. Не о явных аргументах речь, а о неявном.
Цитата Сообщение от IGPIGP Посмотреть сообщение
C++
1
A=B>C>D>E;
И что в этом случае хотелось бы получить?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.08.2013, 15:00

Callback как член класса
В общем, захотел я немного поработать с библиотекой libgit2. Эта библиотека предоставляет API...

Массив как член класса
Почему мне GCC выдаёт ошибку компиляции, что это zero-sized array ? struct Base { const...

Vector как член класса
собственно заголовок моего класса: #pragma once #include <Vector> #include "StdAfx.h" ...

Ifstream& как член класса
Здравствуйте. Решаю задачу: Напишите функцию, получающую и качестве аргументов istream и ...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

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