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

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

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


http://www.cyberforum.ru/cpp-beginners/thread1082469.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.08.2013, 20:15
Я подобрал для вас темы с готовыми решениями и ответами на вопрос operator+ как член класса (C++):

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

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

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

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

Как вызвать член класса по адресу?
В общем вопрос такой: допустим есть адрес класса, то получается по...

42
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
7002 / 3294 / 448
Регистрация: 04.12.2011
Сообщений: 9,114
Записей в блоге: 5
15.08.2013, 15:21 #21
Цитата Сообщение от Tulosba Посмотреть сообщение
И что в этом случае хотелось бы получить?
Хотелось бы, - громко сказано. Максимум удовольствия, наверное.

Добавлено через 3 минуты
Цитата Сообщение от Tulosba Посмотреть сообщение
Всё же ссылки и две const))
Речь о модификации this функцией, которая модифицировать не должна.
Я не так понял. В классе + с двумя аргументами не получится. А вне класса придётся модифицировать одно из слагаемых. А за это гореть в аду...
0
Tulosba
:)
Эксперт С++
4746 / 3240 / 496
Регистрация: 19.02.2013
Сообщений: 9,046
15.08.2013, 15:47 #22
Цитата Сообщение от IGPIGP Посмотреть сообщение
А вне класса придётся модифицировать одно из слагаемых.
Для обычного сложения-то? C = A + B. Не требует модификации ни A, ни B.
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
7002 / 3294 / 448
Регистрация: 04.12.2011
Сообщений: 9,114
Записей в блоге: 5
15.08.2013, 16:10 #23
Цитата Сообщение от Tulosba Посмотреть сообщение
Для обычного сложения-то? C = A + B. Не требует модификации ни A, ни B.
В вопросе требуется вернуть не объект, а именно ссылку. Что будем возвращать?
0
Tulosba
:)
Эксперт С++
4746 / 3240 / 496
Регистрация: 19.02.2013
Сообщений: 9,046
15.08.2013, 16:21 #24
Цитата Сообщение от IGPIGP Посмотреть сообщение
В вопросе требуется вернуть не объект, а именно ссылку.
Бредовое желание для операции сложения.
0
Jupiter
15.08.2013, 16:43
  #25

Не по теме:

Цитата Сообщение от IGPIGP Посмотреть сообщение
В вопросе требуется вернуть не объект, а именно ссылку
будем гореть в аду
Цитата Сообщение от Tulosba Посмотреть сообщение
А чтобы не гореть в адах, надо функции-члены, которые не должны менять this, делать константными.
надо просто форкнуть цпп и запилить перегрузку операторов в виде статических методов, как в решотке

0
IGPIGP
15.08.2013, 16:44
  #26

Не по теме:

Цитата Сообщение от Tulosba Посмотреть сообщение
Бредовое желание для операции сложения.
Консенсус.
Цитата Сообщение от Jupiter Посмотреть сообщение
будем гореть в аду
ещё поупираемся.

0
Tulosba
15.08.2013, 17:11
  #27

Не по теме:

Цитата Сообщение от Jupiter Посмотреть сообщение
надо просто форкнуть цпп и запилить перегрузку операторов в виде статических методов, как в решотке
Это, кстати, можно было бы внести в очередной стандарт просто. А в шарпы из плюсов добавить константные функции и возможность readonly объекты создавать внутри функций.

1
Jupiter
15.08.2013, 17:16
  #28

Не по теме:

Цитата Сообщение от Tulosba Посмотреть сообщение
А в шарпы из плюсов добавить константные функции и возможность readonly объекты создавать внутри функций.
и static

0
Tulosba
15.08.2013, 17:24
  #29

Не по теме:

Цитата Сообщение от Jupiter Посмотреть сообщение
и static
Статик внутри функций не нужен. С учетом обязательной принадлежности функции к классу, логичнее перенести ее в класс.

0
Jupiter
15.08.2013, 18:32
  #30

Не по теме:

Цитата Сообщение от Tulosba Посмотреть сообщение
Статик внутри функций не нужен. С учетом обязательной принадлежности функции к классу, логичнее перенести ее в класс.
нечего засорять область видимости

0
Tulosba
15.08.2013, 18:35
  #31

Не по теме:

Цитата Сообщение от Jupiter Посмотреть сообщение
нечего засорять область видимости
в таком случае создать вложенный класс
P.S. Жду ответа: "нечего плодить классы"

0
IGPIGP
15.08.2013, 18:40
  #32

Не по теме:

Цитата Сообщение от Tulosba Посмотреть сообщение
Это, кстати, можно было бы внести в очередной стандарт просто.
Не уж-то это поможет вернуть ссылку на объект, которой создан внутри метода и не погореть. В аду...
Эx-x... Может тогда уже и компилятор чуть-чуть джитнуть? Для динамической типизации.

0
Tulosba
15.08.2013, 18:44
  #33

Не по теме:

Цитата Сообщение от IGPIGP Посмотреть сообщение
Не уж-то это поможет вернуть ссылку на объект
Ссылку вернуть не поможет. Поможет избавиться от друзей, и от this.

1
Jupiter
15.08.2013, 18:48
  #34

Не по теме:

Цитата Сообщение от Tulosba Посмотреть сообщение
нечего плодить классы
именно, бревно в глаз

Цитата Сообщение от IGPIGP Посмотреть сообщение
Эx-x... Может тогда уже и компилятор чуть-чуть джитнуть? Для динамической типизации.
это то чего и не хватает в дебаг-режиме...это залог успеха Apple

1
broDiaga_cpp
24 / 14 / 2
Регистрация: 20.02.2010
Сообщений: 181
15.08.2013, 23:45  [ТС] #35
Что-то, товарищи, форумчане, много ненужного хлама вы написали при довольно простом вопросе. Больше бы по делу и больше бы кода

C++
1
2
3
4
5
myClass& myClass::operator+(const myClass& other)
{
    myClass result(data + other.data);
    return result;
}
и тогда конструкция
C++
1
myClass object3 = object + object2;
работает так как нужно.
1. Является членом класса.
2. Избежал френдовых функций.

Просто в сначала перегружал оператор + как friend, потом появилась задача избавиться от френдов.

Да, кстати!
Можно ли как-то оптимизировать вот это? Чтобы не создавались лишние экземпляры.
C++
1
2
myClass result(data + other.data);
    return result;
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
7002 / 3294 / 448
Регистрация: 04.12.2011
Сообщений: 9,114
Записей в блоге: 5
15.08.2013, 23:56 #36
Во-первых вы просили, чтобы принимал 2 константные ссылки.
Этим и отличается вопрос: - "Как сделать то-то?", от вопроса: - "Как сделать то-то, но так-то и так-то?"
Во-вторых, вернули ссылку на локальный объект.
C++
1
2
3
4
5
myClass& myClass::operator+(const myClass& other)
{
    myClass result(data + other.data);
    return result;
}
можно:
C++
1
2
3
4
5
myClass& myClass::operator+(const myClass& other)
{
   data += other.data;
    return *this;
}
0
Jupiter
Каратель
Эксперт С++
6568 / 3989 / 400
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
15.08.2013, 23:58 #37
Цитата Сообщение от broDiaga_cpp Посмотреть сообщение
работает так как нужно.
садись, два. это возврат ссылки на локальную переменную. объект будет разрушен при выходе из тела метода, и ссылка будет ссылатся на то чего уже нет

Добавлено через 1 минуту
Цитата Сообщение от broDiaga_cpp Посмотреть сообщение
Можно ли как-то оптимизировать вот это? Чтобы не создавались лишние экземпляры.
думаешь компиляторы пишут тупицы? RVO/NRVO
0
broDiaga_cpp
24 / 14 / 2
Регистрация: 20.02.2010
Сообщений: 181
16.08.2013, 00:04  [ТС] #38
Цитата Сообщение от Jupiter Посмотреть сообщение
объект будет разрушен при выходе из тела метода, и ссылка будет ссылатся на то чего уже нет
Код работает так как нужно. В object3 записывается верное значение. Мусора нет.
Да и, если мне правильно помнится, то в Страуструпе были похожие конструкции.

Если я не прав - объясните как правильно.

Добавлено через 46 секунд
Цитата Сообщение от Jupiter Посмотреть сообщение
думаешь компиляторы пишут тупицы?
Насчёт этого я ничего не думаю.
0
Jupiter
Каратель
Эксперт С++
6568 / 3989 / 400
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
16.08.2013, 00:06 #39
Цитата Сообщение от broDiaga_cpp Посмотреть сообщение
Если я не прав - объясните как правильно.
правильно вернуть копию

Цитата Сообщение от broDiaga_cpp Посмотреть сообщение
Код работает так как нужно
работает, пока у вас нет никаких ресурсов типа открытого файла, динамической памяти, сетевого соединения и подобного что будет закрыто/разрушено в деструкторе
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
7002 / 3294 / 448
Регистрация: 04.12.2011
Сообщений: 9,114
Записей в блоге: 5
16.08.2013, 00:09 #40
Цитата Сообщение от IGPIGP Посмотреть сообщение
можно:
C++
1
2
3
4
5
myClass& myClass::operator+(const myClass& other)
{
   data += other.data;
    return *this;
}
лучше +=
C++
1
2
3
4
5
myClass& myClass::operator+=(const myClass& other)
{
   data += other.data;
    return *this;
}
0
16.08.2013, 00:09
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.08.2013, 00:09
Привет! Вот еще темы с решениями:

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

Динамическая матрица как член класса
Доброго времени суток, не так давно отзывчивые люди научили меня тому, что я...

Как инициализировать строковой член класса?
Доброго времени. Подскажите, пожалуйста, как инициализировать строковую...

Статический массив как член класса
Я туплю, что ли, почему это компилируется? о_О struct V { int v; }; V...


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

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

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