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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.90
VladSharikov
22 / 22 / 1
Регистрация: 02.12.2010
Сообщений: 824
#1

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

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

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

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)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.04.2012, 22:31
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Переопределение операции: постфиксный унарный + (C++):

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

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

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

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

Переопределение операции вычитания строк - C++
Нужно переопределить операцию вычитания строк. То есть из первой строки вычитаются все символы,содержащиеся во второй строке. Я...

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

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

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

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

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

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

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

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

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

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

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

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

Переопределение операции. Ошибка Error LNK2019: ссылка на неразрешенный внешний символ - C++
Возникает такая ошибка: 1 error LNK2019: ссылка на неразрешенный внешний символ &quot;public: class three __thiscall three::operator=(class...

Унарный минус на С# - C++
Всем доброго времени суток,помогите пожалуйста с задачкой. (i-мнимая единица) Условие: а=3+4i c=-a a=-3-4i Заранее спасибо:)

Оператор (-) Унарный минус. классы. - C++
Доброе время суток . помогите . составить operator- (унарный минус) ( что бы координаты x и y были отрицательными .( немогу понять как...


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

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

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