Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/48: Рейтинг темы: голосов - 48, средняя оценка - 4.56
5 / 5 / 5
Регистрация: 16.12.2013
Сообщений: 463

Перегрузка инкремента ++

01.03.2014, 20:11. Показов 9965. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Не понимаю как вызвать перегрузку инкремента: void operator ++( int m ); в функции main,какой синтаксис. Я в main циклично ввожу числа и при каждом проходе цикла введенное число должно передаваться в метод ++. Какой синтаксис этой передачи?
файл queue.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include "stdafx.h"
#ifndef QUEUE_H
#define QUEUE_H
 
class queue
{
    
public:
    queue();
    ~queue();
    void operator ++( int m ); //перегрузка
    void operator --();
    void print();
    void suma();
    void size();
private:
    int a[100];
    int start,end;
     int k; 
     int sum,dob;
};
#endif
main
C++
1
2
3
4
5
6
7
8
9
...
for(int i=0;i<100;i++)
    { 
        cin>>n; 
        if(n==0)
            break;
        a=++n;             //здесь происходит вызов
    }
...
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
01.03.2014, 20:11
Ответы с готовыми решениями:

Перегрузка инкремента
Допустим, что некий класс имеет в наличии методы пре(и пост-)фиксного инкрементов. Date&amp; Date::operator++(); Date...

Перегрузка префиксного инкремента
Как перегрузить префиксальный инкремент? class Horse{ private: int x,y; public: Horse(void); void setX(int); ...

Перегрузка операции инкремента
Как известно, постинкремент возвращает r-value, а преинкремент - l-value. То есть: ++(++x); // допустимо (x++)++; // ошибка...

17
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
01.03.2014, 20:20
Цитата Сообщение от Вероника99 Посмотреть сообщение
Какой синтаксис этой передачи?
Никакой, вы запутались, инкремент не работает внешними данными - это унарная операция.

Вам надо у очереди сделать простой метод void add(int m) и вызывать его в цикле a.add(n);
0
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
01.03.2014, 20:24
в оператор ++ числа не передаются. это операция над самим объектом.
есть постфиксный и префиксный инкремент. отличаются только сигнатурами.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Foo
{
  Foo& operator ++ ()
  {
     // префиксный оператор (++foo). делаем свои действия и возвращаем ссылку на себя
     return *this;
  }
 
  const Foo operator ++(int)
  {
     // постфиксный оператор (foo++)
     // сперва делаем копию самого себя. потом делаем свои действия и возвращаем сделанную копию.
     // тут интовый параметр не используется никак. он нужен лишь для того,
     // чтобы копилятор отличал его от префиксной версии
     Foo copyOfThis = *this;
     // do something
     return copyOfThis;
  }
};
0
5 / 5 / 5
Регистрация: 16.12.2013
Сообщений: 463
01.03.2014, 20:25  [ТС]
DrOffset,да,я понимаю.Мне просто по заданию нужно перегрузить операции ++ (добавление элемента в очередь) и --(удаление элемента с очереди). Не знаю,как это правильно реализовать.
0
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
01.03.2014, 20:27
для добавления\удаления в очередь больше подходят операторы += -=. в них аргумент можно передавать.
делать это с ++ -- это бред какой-то. тот, кто придумал такое задание - дебил. ну или вы что-то не так
поняли.
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
01.03.2014, 20:29
Цитата Сообщение от Вероника99 Посмотреть сообщение
Мне просто по заданию нужно перегрузить
Может быть вы тогда дадите текст оригинального задания? Может вы и вправду что не так поняли?
0
5 / 5 / 5
Регистрация: 16.12.2013
Сообщений: 463
01.03.2014, 20:31  [ТС]
Создать класс - очередь. Определить необходимые конструкторы, деструктор. Перегрузить потоковые операции ввода и вывода, операции + + (добавление элемента в очередь), -- (удаление элемента из очереди),! (проверка наличия элементов в очереди).
0
01.03.2014, 20:39

Не по теме:

Цитата Сообщение от DU Посмотреть сообщение
тот, кто придумал такое задание - дебил. ну или вы что-то не так
поняли.
, или тот кто придумал такое задание что-то не так понял, а вы - дебил..

Не по теме:

Не хотел никого обидеть, просто продолжение мысли..

0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
01.03.2014, 20:44
Цитата Сообщение от Вероника99 Посмотреть сообщение
операции + + (добавление элемента в очередь), -- (удаление элемента из очереди)
Понятно.
Наверное имелось в виду что-то такое:
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
35
36
37
38
39
40
41
42
43
44
class queue
{
 
public:
    queue();
    ~queue();
    bool operator++(int)
    {
        int n;
        std::cin >> n;
        if(n != 0)
        {
            // добавление n
 
            return true;
        }
        return false;
    }
    void operator--(int)
    {
        // удаление
    }
    void print();
    void suma();
    void size();
private:
    int a[100];
    int start,end;
    int k;
    int sum, dob;
};
 
int main()
{
    queue a;
 
    for(int i=0;i<100;i++)
    {
        if(!a++)
        {
            break;
        }
    }
}
Но это какой-то чудной стиль. Препод у вас со странностями.
1
5 / 5 / 5
Регистрация: 16.12.2013
Сообщений: 463
01.03.2014, 23:14  [ТС]
DrOffset , о спасибо большое,заработало. Точно,я не подумала о том,что можно в самом методе вводить значения,тогда передавать ничего не надо.

Добавлено через 2 часа 18 минут
А как можно перегрузить вывод дружественной функцией? В обычном виде это функция print:
C++
1
2
3
4
5
6
void queue::print()
{
    for(int i=start+1;i<end+1;i++)
        cout<<" "<<a[i];
    
}
Делаю такое,компилятор ругается
объявляю в queue.h
C++
1
2
3
4
5
6
7
class queue
{
    
public:
...
friend ostream& operator <<(ostream &,const queue&);
...
queue.cpp
C++
1
2
3
4
ostream & operator<<(ostream &os,const queue &t) 
{
    cout<<"jh"; //пока просто для примера
}
main
C++
1
    cout<<a; //вызов,должно быть два параметры,но я не знаю какие именно
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
01.03.2014, 23:31
Цитата Сообщение от Вероника99 Посмотреть сообщение
А как можно перегрузить вывод дружественной функцией?
А что,
C++
1
cout << a;
после определения
C++
1
2
3
4
5
ostream & operator<<(ostream &os, const queue &t) 
{
    cout<<"jh"; //пока просто для примера
    return os;
}
у вас не работает?
Ошибку компилятора еще дайте.
0
5 / 5 / 5
Регистрация: 16.12.2013
Сообщений: 463
01.03.2014, 23:38  [ТС]
Вот такое
c:\documents and settings\мои документы\visual studio 2008\projects\oop_2\oop_2\queue.h(17) : error C2143: синтаксическая ошибка: отсутствие ";" перед "&"
c:\documents and settings\мои документы\visual studio 2008\projects\oop_2\oop_2\queue.h(17) : error C2433: ostream: 'friend' не разрешается для объявлений данных
c:\documents and settings\мои документы\visual studio 2008\projects\oop_2\oop_2\queue.h(17) : error C4430: отсутствует спецификатор типа - предполагается int. Примечание. C++ не поддерживает int по умолчанию
c:\documents and settings\мои документы\visual studio 2008\projects\oop_2\oop_2\queue.h(17) : error C2061: синтаксическая ошибка: идентификатор "ostream"
c:\documents and settings\мои документы\visual studio 2008\projects\oop_2\oop_2\queue.h(17) : error C4430: отсутствует спецификатор типа - предполагается int. Примечание. C++ не поддерживает int по умолчанию
c:\documents and settings\мои документы\visual studio 2008\projects\oop_2\oop_2\queue.h(17) : error C2805: бинарный 'operator <<' имеет слишком мало параметров
c:\documents and settings\мои документы\visual studio 2008\projects\oop_2\oop_2\oop_2.cpp(14) : warning C4620: не найдена постфиксная форма 'operator ++' для типа 'queue'; используется префиксная форма
c:\documents and settings\мои документы\visual studio 2008\projects\oop_2\oop_2\queue.h(6): см. объявление 'queue'
c:\documents and settings\мои документы\visual studio 2008\projects\oop_2\oop_2\oop_2.cpp(22) : warning C4621: не найдена постфиксная форма 'operator --' для типа 'queue'; используется префиксная форма
c:\documents and settings\мои документы\visual studio 2008\projects\oop_2\oop_2\queue.h(6): см. объявление 'queue'
c:\documents and settings\мои документы\visual studio 2008\projects\oop_2\oop_2\oop_2.cpp(27) : error C2679: бинарный '<<': не найден оператор, принимающий правый операнд типа 'queue' (или приемлемое преобразование отсутствует)
c:\program files\microsoft visual studio 9.0\vc\include\ostream(653): может быть 'std::basic_ostream<_Elem,_Traits> &std::operator <<<char,std::char_traits<char>>(std::bas ic_ostream<_Elem,_Traits> &,const char *)'
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
01.03.2014, 23:46
Вероника99, мне кажется причина в чем-то другом. Покажите весь код, пожалуйста
0
5 / 5 / 5
Регистрация: 16.12.2013
Сообщений: 463
01.03.2014, 23:50  [ТС]
Да,возможно)
queue.h
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
#include "stdafx.h"
#include <iostream>
#ifndef QUEUE_H
#define QUEUE_H
 
class queue
{
    
public:
    queue();
    ~queue();
    bool operator ++();
    bool operator --();
    bool queue::operator!();
    void print();   
    void suma();
    void size();
    friend ostream& operator <<(ostream &, const queue &);
private:
    int a[100];
    int start,end;
     int k; 
     int sum,dob;
     
};
 
#endif
queue.cpp

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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
#include "stdafx.h"
#include "queue.h"
#include <iostream>
using namespace std;
 //enum { SIZE = 10 };
 
queue::queue()
{
 
    start=0;
    end=0;
    k=0;
    sum=0;
    dob=1;
}
ostream & operator<<(ostream &f,const queue &s)
{
    for (int i = s.start; i < s.end; i = (i + 1))
            f << s.a[i] << " ";
        return f;
}
bool queue::operator --()
{
 
    if ( start == end )
    {
        cout<<"Queue is empty!";
        return false;
    }
   
 
    start++;
    // cout<<"Element "<<a[start]<<"\n"; //start=кол-во елементов
    if(start==100)
        start=0;
    k=k-1;
    return true;
    
    
}
 
bool queue::operator ++()
{
    int n;
    cin>>n;
  /*  if ( 100== start )
    {
        cout<<"Queue is full!";
        return 0;
    }*/
    if(n!=0)
    {
        end++;
        if(end==100)
        end=0;
 
        a[end] = n;
        return true;
    }   
    return false;
}
bool queue::operator!()
{
    
    if(!(k==0));
    
    //  cout<<"FULL k="<<k;
    return true;
    
    return false;
}
 
void queue::suma()
{
        for(int i=start+1;i<end+1;i++)
    {
        sum+=a[i];
        dob*=a[i];
    }
    cout<<"\nGeneral count "<<k<<"\nSum="<<sum<<"\nDobytok "<<dob<<endl;
    
}
 
void queue::size()
{
    k=end-start;
 
}
void queue::print()
{
    for(int i=start+1;i<end+1;i++)
        cout<<" "<<a[i];
    
}
 queue::~queue()
{
    
}
main
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
#include "stdafx.h"
#include "queue.h"
#include <iostream>
#include <conio.h>
using namespace std;
 
int main()
{
    
    queue a; //object
    cout<<"Enter numbers:";
    for(int i=0;i<100;i++)
    { 
        if(!a++)
            break;
    }
    
    a.size();
    a.suma();
 
    a.print();
    a--;
    cout<<"\n Nov ";
    a.print();
    
    !a;
    cout<<a;
    return 0;
}
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
02.03.2014, 00:03
Цитата Сообщение от Вероника99 Посмотреть сообщение
Да,возможно)
Надо добавить std:: (основная ошибка)
C++
1
    friend std::ostream& operator <<(std::ostream &, const queue &);
Дополнительно:

Перенесите include внутрь include-gurad:
C++
1
2
3
4
5
6
7
#ifndef QUEUE_H
#define QUEUE_H
 
#include "stdafx.h"
#include <iostream>
 
//...
Уберите queue:: здесь:
C++
1
2
3
4
5
6
7
public:
//...
    bool operator ++();
    bool operator --();
    bool queue::operator!();
    void print();
//...
1
5 / 5 / 5
Регистрация: 16.12.2013
Сообщений: 463
02.03.2014, 00:13  [ТС]
DrOffset ,ураа спасибо,заработало наконец) На счет queue::
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
 
    
 
public:
//...
    bool operator ++();
    bool operator --();
    bool queue::operator!();
    void print();
//...
тупанула
1
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
02.03.2014, 00:15
Цитата Сообщение от Вероника99 Посмотреть сообщение
ураа спасибо,заработало наконец)

Не по теме:


Да не за что, приятно видеть, что вы сами разбираетесь, а не просто просите решить за вас задание :)

0
5 / 5 / 5
Регистрация: 16.12.2013
Сообщений: 463
02.03.2014, 00:27  [ТС]
DrOffset ,да,я же все-таки научиться хочу,еще раз спасибо)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
02.03.2014, 00:27
Помогаю со студенческими работами здесь

перегрузка оператора инкремента
клас class MyRectangle{ public: int xUpLeft; int yUpLeft; int xDownRight; int yDownRight; char *backgroundColor; }

Перегрузка операторов инкремента
Мне надо перегрузить инкримент, я пытался сделать постфиксный и + . Я вродебы сделал, но оно почему-то не выводит.( prog.h #pragma once...

Перегрузка постфиксного инкремента
Всем добрый вечер. Возникла вот такая проблема. Я перегрузил оператор вывода и оператор постфиксного инкремента. Проблема обнаружилась при...

Перегрузка постфиксной и префиксной операции инкремента
Здравствуйте! У меня возник вопрос: почему выводит разный результат, казалось бы, одинаковый код Вот здесь выводит как должно: ...

Перегрузка оператора инкремента/декремента через friend
Нужно реализовать перегрузку унарного оператора через friend. Что я пытаюсь сделать: friend void operator -- ();//prototype void...


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru