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

Переопределение операции: постфиксный унарный + - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.90
VladSharikov
 Аватар для VladSharikov
22 / 22 / 1
Регистрация: 02.12.2010
Сообщений: 824
08.04.2012, 22:31     Переопределение операции: постфиксный унарный + #1
Привет. Делаю переопределение операции для стека, нужно сделать постфиксный +, как добавление нового элемента.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
    stack& operator+() {
 
        node *new_node = new node;
        if(!new_node) 
            exit(1);
        cout << "\t\t Введите = ";
        cin >> new_node ->data;
        new_node -> next = top;
        top = new_node;
        size++;
 
        return *this;
    }
Сделал таким образом - оказывается это префиксный +.
то есть
C++
1
2
stack s;
+s;
Как сделать постфиксный? то есть "s+;" ?

Интересно, что если таким же способом переопределить инкремент "++", то будет доступен и префиксный и постфиксный способ, а просто с "+" - нет.
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
panicwassano
591 / 559 / 20
Регистрация: 07.11.2010
Сообщений: 2,004
08.04.2012, 22:41     Переопределение операции: постфиксный унарный + #2
а разве постфиксный унарный оператор + есть? - и + префиксные унарные есть точно
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
08.04.2012, 22:46     Переопределение операции: постфиксный унарный + #3
Цитата Сообщение от VladSharikov Посмотреть сообщение
Делаю переопределение операции для стека, нужно сделать постфиксный +, как добавление нового элемента.
Не выпендривайтесь и сделайте функцией.
VladSharikov
 Аватар для VladSharikov
22 / 22 / 1
Регистрация: 02.12.2010
Сообщений: 824
08.04.2012, 23:07  [ТС]     Переопределение операции: постфиксный унарный + #4
Задание такое.
Переопределение +.
Я так понимаю надо и постфикс и префикс переопределить.
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
08.04.2012, 23:11     Переопределение операции: постфиксный унарный + #5
VladSharikov, постфикса нет.

Добавлено через 2 минуты
А задание идиотское. Если учитесь на программиста и вам говорят, что в перегруженном операторе круто вводить данные - это не так.
panicwassano
591 / 559 / 20
Регистрация: 07.11.2010
Сообщений: 2,004
08.04.2012, 23:14     Переопределение операции: постфиксный унарный + #6
VladSharikov перегрузка операторов введена для того чтобы вы работали с конкретными типами(классами) как со встроенными. Другие вас не поймут, не делайте так
VladSharikov
 Аватар для VladSharikov
22 / 22 / 1
Регистрация: 02.12.2010
Сообщений: 824
08.04.2012, 23:22  [ТС]     Переопределение операции: постфиксный унарный + #7
soon,
ок, спасибо, не подумал, что постфикса нет

ой, да я считаю, что это вообще идиотизм.
могу для "угара" скинуть задание

Код
Создать объект типа стек. Перегрузить оператор + как функцию член и * как дружественную функцию. + складывает элемент в новый стек, * умножает верхушку стека на параметр. Стеки можно присваивать, проверять на равенство == или !=, вводить и выводить в поток, добавлять += элемент в стек.
Bers
Заблокирован
09.04.2012, 00:29     Переопределение операции: постфиксный унарный + #8
Цитата Сообщение от VladSharikov Посмотреть сообщение
ой, да я считаю, что это вообще идиотизм.
А я считаю, что ты не правильно понял задание.

"...+ складывает элемент в новый стек..."

C++
1
2
3
stack& operator+() {
node *new_node = new node; 
...
Где в задании написано, что оператор+ должен создавать новый объект?
VladSharikov
 Аватар для VladSharikov
22 / 22 / 1
Регистрация: 02.12.2010
Сообщений: 824
09.04.2012, 00:30  [ТС]     Переопределение операции: постфиксный унарный + #9
Как положить что-то куда-то не выделив под это что-то память?
Bers
Заблокирован
09.04.2012, 01:15     Переопределение операции: постфиксный унарный + #10
Цитата Сообщение от VladSharikov Посмотреть сообщение
Как положить что-то куда-то не выделив под это что-то память?
Ты осознаешь разницу между "выделить память под объект", и "создать объект" ?

Если нет, то я приведу тебе простейший пример: предположим, есть класс, экземпляры которого могут быть созданы с дефолтными настройками, или при помощи целой пачки явных конструкторов.

Как твой стек узнает, какой именно конструктор нужен, и с какими именно параметрами его нужно дернуть, что бы создать конкретный объект?

Задача всякого рода контейнеров - хранить объекты. Но они не делают предположений о том, как именно изначально были созданы эти объекты попавшие в контейнер снаружи.

А теперь подумай, как именно тебе следует организовать operator+ согласно твоему заданию.
VladSharikov
 Аватар для VladSharikov
22 / 22 / 1
Регистрация: 02.12.2010
Сообщений: 824
09.04.2012, 01:29  [ТС]     Переопределение операции: постфиксный унарный + #11
Складывать, положить, поместить...
Цитата Сообщение от Bers Посмотреть сообщение
в контейнер
значит поместить в какой-то контейнер, в данном случае контейнер - стек, что-то. Что-то, в данном случае, элемент. Как поместить элемент в стек , не выделив под этот элемент память?
Bers
Заблокирован
09.04.2012, 01:47     Переопределение операции: постфиксный унарный + #12
Цитата Сообщение от VladSharikov Посмотреть сообщение
Складывать, положить, поместить...

значит поместить в какой-то контейнер, в данном случае контейнер - стек, что-то. Что-то, в данном случае, элемент. Как поместить элемент в стек , не выделив под этот элемент память?
Ты не улавливаешь момент: "выделить память под объект", и "создать объект" - это разные вещи.

Изюминка задания заключается не в том, как выделить память. А в том, как создать объект.

Контейнер не знает о том, как именно должен быть создан хранимый объект.
Но ему ничего не мешает клонировать уже существующий объект, и сохранить внутри себя эту копию.

Получается, что объекты создаются снаружи, потом передаются контейнеру. Контейнер делает копии, и складывает эти копии внутри себя.

Внешне это может выглядеть так:

C++
1
2
3
4
CStack stack;  
SNode node;    //создали объект снаружи
 
stack.push_back(node); //добавили объект в контейнер
Только тебе по заданию нужно использовать не просто функцию-член, а operator+

Должно получиться что-то вроде:


C++
1
2
3
4
CStack stack;  
SNode node;    //создали объект снаружи
 
stack + node; //добавили объект в контейнер
VladSharikov
 Аватар для VladSharikov
22 / 22 / 1
Регистрация: 02.12.2010
Сообщений: 824
09.04.2012, 02:20  [ТС]     Переопределение операции: постфиксный унарный + #13
Хорошо, допустим так. Но ведь в любом случае добавляя что-то к контейнеру stack мы должны выделить под это память?

За идею спасибо, сейчас переделаю

C++
1
2
3
4
5
6
7
8
9
stack& operator+(node *temp) {
        if(!temp) 
            exit(1);
        temp -> next = top;
        top = temp;
        size++;
 
        return *this;
    }
Все разобрался. И разобрался почему не надо выделять память. Идею саму не понимал. Спасибо!
Bers
Заблокирован
09.04.2012, 02:24     Переопределение операции: постфиксный унарный + #14
Цитата Сообщение от VladSharikov Посмотреть сообщение
Но ведь в любом случае добавляя что-то к контейнеру stack мы должны выделить под это память?
Да. Но контейнер может по собственному усмотрению решать, как именно эту память выделять.
Например, можно в ручную выделять память при помощи new, или же воспользоваться массивом (если заранее известно максимальное количество элементов). Ну или воспользоваться услугами std::vector, и тп.
VladSharikov
 Аватар для VladSharikov
22 / 22 / 1
Регистрация: 02.12.2010
Сообщений: 824
09.04.2012, 02:25  [ТС]     Переопределение операции: постфиксный унарный + #15
Вот кстати. Если тут столкнулся с проблемой "понимания", может быть и тут подскажете?

C++
1
2
    friend void operator<<(ostream&, const stack&);
    friend void operator>>(istream&, stack&);
C++
1
2
3
4
5
6
7
void operator<<(ostream& cout_, stack& object) {
    object.Showstack();
}
 
void operator>>(istream& cin_, stack& object) {
    object.Addstack();
}
Нужно было организовать потоковый ввод/вывод. сдается мне я это тоже неправильно сделал.
Bers
Заблокирован
09.04.2012, 02:47     Переопределение операции: постфиксный унарный + #16
Сообщение было отмечено автором темы, экспертом или модератором как ответ
По хорошему, тут требуются итераторы.
Но что бы проиллюстрировать идею, лучше сделать попроще:

Что бы вывести на консоль все элементы стека, можно просто тупо перебрать все элементы, один за другим:
C++
1
2
3
4
5
6
7
8
void operator<<(ostream& cout_, stack& object) {
    object.Begin(); //сделает текущим самый первый элемент стека
    while (  object.IsEnd()==false)
    {
            cout_ << object.GetObject(); //вернёт текущий элемент стека
            object.Next();              //сделает текущим следующий элемент стека
    }
}
При этом, получается, что метод object.GetObject() возвращает текущий элемент стека. Допустим, элемент имеет тип SNode.

Тогда, std::cout должен уметь вывести на консоль тип данных SNode

Это значит, что ты должен подружить std::cout не только со своим стеком, но и с типом данных самих элементов.

Что можно было сделать так:

C++
1
2
3
SNode node;
 
std::cout<< node; //за счет перегрузки глобального оператора operator<<
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.04.2012, 18:10     Переопределение операции: постфиксный унарный +
Еще ссылки по теме:

C++ Переопределение операции присваивания
C++ Переопределение операции []
C++ Переопределение операции вычитания строк

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

Или воспользуйтесь поиском по форуму:
VladSharikov
 Аватар для VladSharikov
22 / 22 / 1
Регистрация: 02.12.2010
Сообщений: 824
09.04.2012, 18:10  [ТС]     Переопределение операции: постфиксный унарный + #17
Спасибо
Yandex
Объявления
09.04.2012, 18:10     Переопределение операции: постфиксный унарный +
Ответ Создать тему
Опции темы

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