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

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

Восстановить пароль Регистрация
 
VladSharikov
 Аватар для VladSharikov
22 / 22 / 1
Регистрация: 02.12.2010
Сообщений: 824
08.04.2012, 16:02     Переопределение операторов как член-класса и как дружественная функция #1
Привет.

Задача создать класс целых чисел, для него нужно переопределить операторы ++ и + как функции-члены и -- и - как дружественные функции.
С 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--;
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.04.2012, 16:02     Переопределение операторов как член-класса и как дружественная функция
Посмотрите здесь:

Преобразование типа аргумента в тип класса и дружественная функция C++
Почему дружественная функция с перегруженным оператором << не имеет доступа к данным класса? C++
C++ Функция, дружественная классу, вложенному в шаблонный класс, или как написать итератор.
Дружественная функция, объявлённая ранее вне пространства имён класса -> error LNK2019 в Visual Studio 2012 C++
C++ Шаблон класса и дружественная функция
C++ Не функция-член класса
Дружественная функция-оператор, доступ к закрытым полям класса C++
C++ Дружественная функция класса

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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;
}
VladSharikov
 Аватар для 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&. Прошлая версия была ошибочной
Yandex
Объявления
08.04.2012, 23:06     Переопределение операторов как член-класса и как дружественная функция
Ответ Создать тему
Опции темы

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