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

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

Войти
Регистрация
Восстановить пароль
 
VladSharikov
22 / 22 / 1
Регистрация: 02.12.2010
Сообщений: 824
#1

Переопределение операторов как член-класса и как дружественная функция - C++

08.04.2012, 16:02. Просмотров 857. Ответов 2
Метки нет (Все метки)

Привет.

Задача создать класс целых чисел, для него нужно переопределить операторы ++ и + как функции-члены и -- и - как дружественные функции.
С 1 я разобрался, а вот как дружественные функции не очень понимаю как сделать.

Какой должен быть прототип для унарной операции "--" декремент и какое должно быть определение. Как дружественной функции! Никто не подскажет?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
class Int {
    friend ostream& operator<<(ostream&, const Int&);
    friend istream& operator>>(istream&, Int&);
 
    friend Int& operator--(Int&);
public:
    int data;
 
    Int() {data = 0;}
    Int(int data) {Int::data = data;}
 
    Int& operator++();
};
 
Int& Int::operator++() {
    ++data;
    return *this;
}
////////////// - не знаю как определить - //////////////////////
Int& operator--(Int&) {
    --Int.data;
   return *Int.data;
}
///////////////////////////////////////////////////////////////////
ostream& operator<<(ostream& cout_, const Int& object) {
    cout_ << object.data;
    return cout_;
}
 
istream& operator>>(istream& cin_, Int& object)
{
    cin_ >> object.data;
    return cin_;
}
Добавлено через 26 минут
Сейчас вычитал, что у friend перегрузки нету указ. на this.
Это же значит что должно быть 2 операнда в параметрах функции. А какие 2 операнда могут быть в УНАРНОЙ операции?

Добавлено через 15 минут
Разобрался с этим. Не надо 2 значения передавать. Надо передать одно. На сам объект класса, который будем декрементировать.
Прототип:
C++
1
friend Int& operator--(Int&);
Определение сделал таким:
C++
1
2
3
4
5
Int& operator--(Int &operand) {
    Int result;
    result.data -= 1;
    return result;
}
Но тогда вызов должен быть таким:
C++
1
2
        Int item = 5;
        item = item--;
Как добиться того, чтобы операция работала просто так
C++
1
item--;
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.04.2012, 16:02
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Переопределение операторов как член-класса и как дружественная функция (C++):

Дружественная функция класса - C++
Проблема в том что дружественная функция класа механик в класе car (friend void update_status) не может обращатся к полям, почему? ...

Шаблон класса и дружественная функция - C++
Доброго времени суток. Столкнулся с непониманием одного процесса. Задача звучит следующим образом: Написать шаблон функции isEqualTo для...

Дружественная шаблонная функция шаблонного класса - C++
Не компилируется. Подскажите правильный синтаксис. template&lt;typename T&gt; class A; template&lt;typename T, typename ... Args&gt; void func(A&lt;T&gt;...

Дружественная функция-оператор, доступ к закрытым полям класса - C++
У меня есть класс MyClass, вот код: class MyClass { int x, y; public: MyClass(); friend ostream &amp; operator &lt;&lt; (ostream &amp;,...

Преобразование типа аргумента в тип класса и дружественная функция - C++
Добрый день. Есть код: class Cls { private: double x; public: Cls(); Cls(double);

Почему дружественная функция не может обратиться к protected полю класса? - C++
Не могу понять, почему функция не может обратиться к protected полю класса: class Ships { protected: int hits; int ships; ...

2
Merovingian
54 / 54 / 5
Регистрация: 24.09.2011
Сообщений: 149
08.04.2012, 16:50 #2
Цитата Сообщение от VladSharikov Посмотреть сообщение
C++
1
friend Int& operator--(Int&);
Определение сделал таким:
C++
1
2
3
4
5
Int& operator--(Int &operand) {
    Int result;
    result.data -= 1;
    return result;
}
К слову: Вы возвращаете ссылку на локальный объект result. Нужно возвращать не ссылку, а объект в таком случае, т.к. после завершения функции, вызывается деструктор для созданного объекта, а на что тогда ссылка? - На уже не существующий объект!
Еще... зачем Int &operand передаёте если он не используется?

Цитата Сообщение от VladSharikov Посмотреть сообщение
Как добиться того, чтобы операция работала просто так
C++
1
item--;
Очень просто.
C++
1
2
3
4
5
6
7
8
9
10
11
Int& Int::operator--() // префиксный
{
    ++data;
    return *this;
}
const Int Int::operator++(int) // постфиксный
{
    Int temp(*this);
    ++data;
    return temp;
}
0
VladSharikov
22 / 22 / 1
Регистрация: 02.12.2010
Сообщений: 824
08.04.2012, 23:06  [ТС] #3
Уже разобрался
C++
1
2
3
4
Int& operator--(Int &operand) {
    operand.data--;
    return operand;
}
Функция должна быть friend - поэтому нужно было передавать Int&. Прошлая версия была ошибочной
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.04.2012, 23:06
Привет! Вот еще темы с ответами:

Почему дружественная функция с перегруженным оператором << не имеет доступа к данным класса? - C++
В заголовочном файле &quot;klass.h&quot; есть класс: class klass { int x; public: klass(); ~klass(); void show(); friend void...

Функция, дружественная классу, вложенному в шаблонный класс, или как написать итератор. - C++
Здравствуйте! Пишу аналог STL vector. Возникают следующие ошибки: source.cpp:11: error: expected initializer before ‘operator’ ...

Перегрузка операций: friend-функция или функция-член класса - C++
Здравствуйте, меня интересует вопрос, в чем разница при перегрузке операторов через operator и friend. Вот к примеру такой код. class...

Сам вопрос: почему функция-член одного класса не вызывается из функции-члена другого класса? - C++
//Щас всё объясню. Так, имеем два класса, в одном я определил функцию-член. Все конструкторы и прочее //опущены для уменьшения кода ...


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

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

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