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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 8, средняя оценка - 4.88
Вероника99
4 / 4 / 1
Регистрация: 16.12.2013
Сообщений: 412
01.03.2014, 20:11     Перегрузка инкремента ++ #1
Не понимаю как вызвать перегрузку инкремента: 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;             //здесь происходит вызов
    }
...
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DrOffset
6424 / 3798 / 879
Регистрация: 30.01.2014
Сообщений: 6,592
01.03.2014, 20:20     Перегрузка инкремента ++ #2
Цитата Сообщение от Вероника99 Посмотреть сообщение
Какой синтаксис этой передачи?
Никакой, вы запутались, инкремент не работает внешними данными - это унарная операция.

Вам надо у очереди сделать простой метод void add(int m) и вызывать его в цикле a.add(n);
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
01.03.2014, 20:24     Перегрузка инкремента ++ #3
в оператор ++ числа не передаются. это операция над самим объектом.
есть постфиксный и префиксный инкремент. отличаются только сигнатурами.
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;
  }
};
Вероника99
4 / 4 / 1
Регистрация: 16.12.2013
Сообщений: 412
01.03.2014, 20:25  [ТС]     Перегрузка инкремента ++ #4
DrOffset,да,я понимаю.Мне просто по заданию нужно перегрузить операции ++ (добавление элемента в очередь) и --(удаление элемента с очереди). Не знаю,как это правильно реализовать.
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
01.03.2014, 20:27     Перегрузка инкремента ++ #5
для добавления\удаления в очередь больше подходят операторы += -=. в них аргумент можно передавать.
делать это с ++ -- это бред какой-то. тот, кто придумал такое задание - дебил. ну или вы что-то не так
поняли.
DrOffset
6424 / 3798 / 879
Регистрация: 30.01.2014
Сообщений: 6,592
01.03.2014, 20:29     Перегрузка инкремента ++ #6
Цитата Сообщение от Вероника99 Посмотреть сообщение
Мне просто по заданию нужно перегрузить
Может быть вы тогда дадите текст оригинального задания? Может вы и вправду что не так поняли?
Вероника99
4 / 4 / 1
Регистрация: 16.12.2013
Сообщений: 412
01.03.2014, 20:31  [ТС]     Перегрузка инкремента ++ #7
Создать класс - очередь. Определить необходимые конструкторы, деструктор. Перегрузить потоковые операции ввода и вывода, операции + + (добавление элемента в очередь), -- (удаление элемента из очереди),! (проверка наличия элементов в очереди).
castaway
01.03.2014, 20:39
  #8

Не по теме:

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

Не по теме:

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

DrOffset
6424 / 3798 / 879
Регистрация: 30.01.2014
Сообщений: 6,592
01.03.2014, 20:44     Перегрузка инкремента ++ #9
Цитата Сообщение от Вероника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;
        }
    }
}
Но это какой-то чудной стиль. Препод у вас со странностями.
Вероника99
4 / 4 / 1
Регистрация: 16.12.2013
Сообщений: 412
01.03.2014, 23:14  [ТС]     Перегрузка инкремента ++ #10
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; //вызов,должно быть два параметры,но я не знаю какие именно
DrOffset
6424 / 3798 / 879
Регистрация: 30.01.2014
Сообщений: 6,592
01.03.2014, 23:31     Перегрузка инкремента ++ #11
Цитата Сообщение от Вероника99 Посмотреть сообщение
А как можно перегрузить вывод дружественной функцией?
А что,
C++
1
cout << a;
после определения
C++
1
2
3
4
5
ostream & operator<<(ostream &os, const queue &t) 
{
    cout<<"jh"; //пока просто для примера
    return os;
}
у вас не работает?
Ошибку компилятора еще дайте.
Вероника99
4 / 4 / 1
Регистрация: 16.12.2013
Сообщений: 412
01.03.2014, 23:38  [ТС]     Перегрузка инкремента ++ #12
Вот такое
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::basic_ostream<_Elem,_Traits> &,const char *)'
DrOffset
6424 / 3798 / 879
Регистрация: 30.01.2014
Сообщений: 6,592
01.03.2014, 23:46     Перегрузка инкремента ++ #13
Вероника99, мне кажется причина в чем-то другом. Покажите весь код, пожалуйста
Вероника99
4 / 4 / 1
Регистрация: 16.12.2013
Сообщений: 412
01.03.2014, 23:50  [ТС]     Перегрузка инкремента ++ #14
Да,возможно)
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;
}
DrOffset
6424 / 3798 / 879
Регистрация: 30.01.2014
Сообщений: 6,592
02.03.2014, 00:03     Перегрузка инкремента ++ #15
Цитата Сообщение от Вероника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();
//...
Вероника99
4 / 4 / 1
Регистрация: 16.12.2013
Сообщений: 412
02.03.2014, 00:13  [ТС]     Перегрузка инкремента ++ #16
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();
//...
тупанула
DrOffset
6424 / 3798 / 879
Регистрация: 30.01.2014
Сообщений: 6,592
02.03.2014, 00:15     Перегрузка инкремента ++ #17
Цитата Сообщение от Вероника99 Посмотреть сообщение
ураа спасибо,заработало наконец)

Не по теме:


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

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.03.2014, 00:27     Перегрузка инкремента ++
Еще ссылки по теме:

C++ Перегрузка префиксного оператора инкремента с возвращающим значением
Перегрузка префиксного инкремента C++
Перегрузка операторов инкремента C++

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

Или воспользуйтесь поиском по форуму:
Вероника99
4 / 4 / 1
Регистрация: 16.12.2013
Сообщений: 412
02.03.2014, 00:27  [ТС]     Перегрузка инкремента ++ #18
DrOffset ,да,я же все-таки научиться хочу,еще раз спасибо)
Yandex
Объявления
02.03.2014, 00:27     Перегрузка инкремента ++
Ответ Создать тему
Опции темы

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