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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.80
broDiaga_cpp
22 / 12 / 1
Регистрация: 20.02.2010
Сообщений: 180
#1

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

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

Могу ли я сделать operator+ как член класса таким образом?
C++
1
2
3
4
5
myClass& myClass::operator+(const myClass& other1, const myClass& other2)
{
    data += other.data;
    return *this;
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.08.2013, 20:15
Здравствуйте! Я подобрал для вас темы с ответами на вопрос operator+ как член класса (C++):

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

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

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

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

Массив как член класса - C++
Почему мне GCC выдаёт ошибку компиляции, что это zero-sized array ? struct Base { const char* d{"f", "f"}; }; ISO C++...

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Tulosba
15.08.2013, 18:35     operator+ как член класса
  #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
22 / 12 / 1
Регистрация: 20.02.2010
Сообщений: 180
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
Комп_Оратор)
Эксперт по математике/физике
6471 / 3119 / 306
Регистрация: 04.12.2011
Сообщений: 8,594
Записей в блоге: 4
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
Каратель
Эксперт С++
6554 / 3975 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
15.08.2013, 23:58 #37
Цитата Сообщение от broDiaga_cpp Посмотреть сообщение
работает так как нужно.
садись, два. это возврат ссылки на локальную переменную. объект будет разрушен при выходе из тела метода, и ссылка будет ссылатся на то чего уже нет

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

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

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

Цитата Сообщение от broDiaga_cpp Посмотреть сообщение
Код работает так как нужно
работает, пока у вас нет никаких ресурсов типа открытого файла, динамической памяти, сетевого соединения и подобного что будет закрыто/разрушено в деструкторе
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6471 / 3119 / 306
Регистрация: 04.12.2011
Сообщений: 8,594
Записей в блоге: 4
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
broDiaga_cpp
22 / 12 / 1
Регистрация: 20.02.2010
Сообщений: 180
16.08.2013, 00:15  [ТС] #41
Итак, правильно ли я понял:
ссылку на объект можем возвращать в следующем случае
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)
{
    myClass result(data + other.data);
    return result;
}
0
Jupiter
Каратель
Эксперт С++
6554 / 3975 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
16.08.2013, 00:16 #42
Цитата Сообщение от broDiaga_cpp Посмотреть сообщение
Итак, правильно ли я понял:
правильно.
можно даже сразу так:
C++
1
2
3
4
myClass myClass::operator+(const myClass& other)
{
    return myClass(data + other.data);
}
1
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6471 / 3119 / 306
Регистрация: 04.12.2011
Сообщений: 8,594
Записей в блоге: 4
16.08.2013, 00:22 #43
Да, но сделать дружественной и принять два параметра лучше. Могут же быть варианты перегрузки:
myClass myClass::operator+(const int lhs, const myClass& other)
тут левый объект не класс и дружественная функция это позволяет.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.08.2013, 00:22
Привет! Вот еще темы с ответами:

Статический массив как член класса - C++
Я туплю, что ли, почему это компилируется? о_О struct V { int v; }; V v1; V v2(v1); // копирование v2 = v1; //...

Как инициализировать строковой член класса? - C++
Доброго времени. Подскажите, пожалуйста, как инициализировать строковую переменную класса, используя конструктор? #include <iostream> ...

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

Динамическая матрица как член класса - C++
Доброго времени суток, не так давно отзывчивые люди научили меня тому, что я хочу старая тема Путём ручное выделения памяти под нужный...


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

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

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