Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.87/15: Рейтинг темы: голосов - 15, средняя оценка - 4.87
25 / 25 / 7
Регистрация: 02.12.2010
Сообщений: 824
1

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

08.04.2012, 22:31. Показов 3057. Ответов 16
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Привет. Делаю переопределение операции для стека, нужно сделать постфиксный +, как добавление нового элемента.

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+;" ?

Интересно, что если таким же способом переопределить инкремент "++", то будет доступен и префиксный и постфиксный способ, а просто с "+" - нет.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.04.2012, 22:31
Ответы с готовыми решениями:

Переопределение операции []
В классе строка переопределить операцию , которая будет возвращать символ по индексу, который...

Переопределение операции инкремента
Добрый вечер! Задачка простая и кода с примерами в сети куча, но меня волнует вопрос почему...

Переопределение операции ввода
Всем доброго времени суток. Сейчас пытаюсь переопределить операцию ввода для вектора. Написал...

Переопределение операции присваивания
Есть вот такой класс: #ifndef cd_h #define cd_h class Cd { private: char* performance;...

16
601 / 569 / 104
Регистрация: 07.11.2010
Сообщений: 2,004
08.04.2012, 22:41 2
а разве постфиксный унарный оператор + есть? - и + префиксные унарные есть точно
0
2554 / 1319 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
08.04.2012, 22:46 3
Цитата Сообщение от VladSharikov Посмотреть сообщение
Делаю переопределение операции для стека, нужно сделать постфиксный +, как добавление нового элемента.
Не выпендривайтесь и сделайте функцией.
1
25 / 25 / 7
Регистрация: 02.12.2010
Сообщений: 824
08.04.2012, 23:07  [ТС] 4
Задание такое.
Переопределение +.
Я так понимаю надо и постфикс и префикс переопределить.
0
2554 / 1319 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
08.04.2012, 23:11 5
VladSharikov, постфикса нет.

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

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

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

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

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

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

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

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

А теперь подумай, как именно тебе следует организовать operator+ согласно твоему заданию.
0
25 / 25 / 7
Регистрация: 02.12.2010
Сообщений: 824
09.04.2012, 01:29  [ТС] 11
Складывать, положить, поместить...
Цитата Сообщение от Bers Посмотреть сообщение
в контейнер
значит поместить в какой-то контейнер, в данном случае контейнер - стек, что-то. Что-то, в данном случае, элемент. Как поместить элемент в стек , не выделив под этот элемент память?
0
Заблокирован
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; //добавили объект в контейнер
0
25 / 25 / 7
Регистрация: 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;
    }
Все разобрался. И разобрался почему не надо выделять память. Идею саму не понимал. Спасибо!
0
Заблокирован
09.04.2012, 02:24 14
Цитата Сообщение от VladSharikov Посмотреть сообщение
Но ведь в любом случае добавляя что-то к контейнеру stack мы должны выделить под это память?
Да. Но контейнер может по собственному усмотрению решать, как именно эту память выделять.
Например, можно в ручную выделять память при помощи new, или же воспользоваться массивом (если заранее известно максимальное количество элементов). Ну или воспользоваться услугами std::vector, и тп.
0
25 / 25 / 7
Регистрация: 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();
}
Нужно было организовать потоковый ввод/вывод. сдается мне я это тоже неправильно сделал.
0
Заблокирован
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<<
0
25 / 25 / 7
Регистрация: 02.12.2010
Сообщений: 824
09.04.2012, 18:10  [ТС] 17
Спасибо
0
09.04.2012, 18:10
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.04.2012, 18:10
Помогаю со студенческими работами здесь

Переопределение операции присваивания
В случае, когда в классе есть члены, память под которые выделяется динамически, операцию...

Переопределение операции вычитания строк
Нужно переопределить операцию вычитания строк. То есть из первой строки вычитаются все...

Переопределение операции (-) вычитания для строк
Как переопределить вычитание для строк. С &quot;+&quot; более-менее понятно, а вот с &quot;-&quot; проблема.. Базовый...

переопределение операции сложения вычетания сравнения
Создать железнодорожный состав и переопределить для него операции сложения, вычитания и сравнения...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru