Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/3: Рейтинг темы: голосов - 3, средняя оценка - 5.00
21 / 21 / 8
Регистрация: 05.01.2012
Сообщений: 282
1

Перегруженный постфиксный оператор ++

04.11.2014, 18:19. Просмотров 527. Ответов 3
Метки нет (Все метки)

Есть задание:
Кликните здесь для просмотра всего текста
Создать класс "нота": название, октава, продолжительность звучания.
Производные: "звук" (частота) и "изображение" (координаты на экране левого верхнего угла фрагмента нотного стана). В обоих классах - порядковый номер ноты, определить функцию output() - для каждого класса с разной реализацией.
В производных классах перегрузить операции постфиксный ++ - для получения следующей ноты, префиксный ++ - для увеличения длительности звучания ноты вдвое. Функцию output() превратить в виртуальную.


Никак не могу понять что должен делать перегруженный постфиксный ++.
Вопрос: Какую следующею ноту он должен получать? В классе же описывается только 1 нота с параметрами. Или нужно вытаскивать ноту из другого объекта класса. Если да, то как это сделать. Реализовать в классе функции или перегруженные операторы которые работают с массивом объектов этого класса неправильно. Или я ошибаюсь?

Note.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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <iostream>
 
using namespace std;
 
class Note
{
protected:
    char name[16];
    int octave;
    int time;
public:
    virtual void output();
    Note();
    Note(char*, int, int);
    ~Note();
};
 
class Sound : public Note
{
private:
    int frequency;
    int number;
public:
 
    void output();
    void setFrequency(int);
    void setNumber(int);
 
    friend Sound& operator++(Sound&);
};
 
class Image : public Note
{
private:
    int X;
    int Y;
    int number;
public:
    void output();
    void setPositions(int, int);
    void setNumber(int);
 
    friend Image operator++(Image&, int);
};


Note.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
#include "Note.h"
 
void Note::output() 
{
    cout << "Name: " << name << '\n';
    cout << "Octave: " << octave << '\n';
    cout << "Time:" << time << '\n';
}
Note::Note()
{
    cout << "Calling constructor ...\n";
    cout << "Input name: "; cin >> name;
    cout << "Input octave: "; cin >> octave; 
    cout << "Input time: "; cin >> time; 
}
Note::Note(char *n, int o, int t)
{
    strcpy_s(name, n);
    octave = o;
    time = t;
}
Note::~Note()
{
    cout << "Deleting all objects of class ...\n";
}
 
void Sound::output()
{
    cout << "Name: " << name << '\n';
    cout << "Octave: " << octave << '\n';
    cout << "Time:" << time << '\n';
    cout << "Frequency: " << frequency << '\n';
    cout << "Number: " << number << '\n';
}
void Sound::setFrequency(int f)
{
    frequency = f;
}
void Sound::setNumber(int n)
{
    number = n;
}
Sound& operator++(Sound& i) {
    i.octave = i.octave*2;
    return i;
}
 
void Image::output()
{
    cout << "Name: " << name << '\n';
    cout << "Octave: " << octave << '\n';
    cout << "Time:" << time << '\n';
    cout << "Position X=" << X <<", Y=" << Y << '\n';
    cout << "Number: " << number << '\n';
}
void Image::setPositions(int x, int y)
{
    X = x;
    Y = y;
}
void Image::setNumber(int n)
{
    number = n;
}
Image operator++(Image& i, int) {
    i.X++;
    i.Y++;
    return i;
}


Main.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
#include <iostream>
#include "Note.h"
 
using namespace std;
 
int main()
{
    // Класc Note
    Note objNote;
    objNote.output();
 
    // Класc Sound
    int l;
    cout << "Input the number of notes: "; cin >> l;
    Sound *objSound = new Sound[l];
 
    for (int i = 0; i < l; i++)
    {
        int f, n;
        cout << "Input frequency and number: ";
        cin >> f >> n;
        objSound[i].setFrequency(f);
        objSound[i].setNumber(n);
        ++objSound[i];
    }
 
    for (int i=0; i<l; i++)
    {
        cout << "Note " << i+1 << '\n';
        objSound[i].output();
    }
 
    // Клас Image
    Image objImage;
    objImage.setNumber(0);
    objImage.setPositions(5, 5);
    objImage++;
    objImage.output();
 
    system("PAUSE");
    delete[] objSound;
    return 0;
}


Еще один маленький вопрос: Где лучше прописывать классы производные от базового? В том же файле, как сделано у меня, или в разных?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.11.2014, 18:19
Ответы с готовыми решениями:

Перегруженный оператор
MathClass = Harry; Раньше я думал, что перегрузка - это предоставление оператору функций,...

перегруженный оператор <<
подскажите как перегрузить оператор &lt;&lt; для класса как описать само перегружение friend ostream&amp;...

Глобальный перегруженный оператор
Как организовать работу глобального перегруженного оператора &quot;-&quot;, который должен сравнивать 5...

Не вызывается перегруженный оператор
#include&lt;iostream&gt; using namespace std; struct dates { int num; int count; dates *back;...

3
6908 / 5973 / 2709
Регистрация: 14.04.2014
Сообщений: 25,504
04.11.2014, 19:08 2
C++
1
2
3
4
5
6
7
Image operator ++ (Image& i, int)
{
    Image old(i);
    i.X++;
    i.Y++;
    return old;
}
И конструктор копирования сделай.
1
21 / 21 / 8
Регистрация: 05.01.2012
Сообщений: 282
05.11.2014, 01:37  [ТС] 3
nmcf, для чего именно нужен будет конструктор копирования и как его реализовать? Раньше с подобным не работал, не знаю с чего начать.
0
6908 / 5973 / 2709
Регистрация: 14.04.2014
Сообщений: 25,504
05.11.2014, 10:07 4
Третью строку видишь в моём примере? Вот для этого и нужен. Новый объект создаётся как копия уже существующего:
C++
1
2
3
4
Image::Image(const Image & i)
{
...
}
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.11.2014, 10:07

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Функтор и перегруженный оператор
захотел понять многопоточность в новом стадарте с++11 - смотрю...

Функции и перегруженный оператор
Помогите реализовать на С++: 1.Определить пользовательский тип данных fraction (дробь),...

Не работает перегруженный оператор
Привет, у меня есть класс такой: class Sterling { private: long pounds = 0; int shillings =...

Перегруженный оператор вывода
Есть базовый класс Точка и его наследник Круг. Как в Круге использовать operator&lt;&lt; для Точки? Надо...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

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