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

Создать на базе класса с реализацией очереди клас потомок — кольцевая очередь - C++

Восстановить пароль Регистрация
 
L3xx__
1 / 1 / 0
Регистрация: 17.11.2013
Сообщений: 17
15.08.2014, 00:33     Создать на базе класса с реализацией очереди клас потомок — кольцевая очередь #1
Доброго времени суток. Я хотел создать на базе класса с реализацией очереди клас потомок - кольцевая очередь.
Исходник:
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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
#include <iostream>
#include <cstdlib>
#include <time.h>
 
using namespace std;
 
class Queue{
protected:
    int *Wait;
    int MaxQueueLen;
    int QueueLen;
public:
    Queue(int m);
    ~Queue();
    void Add(int c);
    int Extract();
    void Clear();
    bool IsEmpty();
    bool IsFull();
    int GetCount();
    void Show();
};
 
void Queue :: Show(){
    cout << "\n-------------------------------------------------\n";
    for(int i=0; i < QueueLen; i++)
        cout << Wait[i] << " ";
    cout << "\n-------------------------------------------------\n";
}
 
Queue :: ~Queue(){
    delete [] Wait;
}
 
Queue :: Queue(int m){
    MaxQueueLen = m;
    Wait = new int [MaxQueueLen];
    QueueLen = 0;
}
 
void Queue :: Clear (){
    QueueLen = 0;
}
 
bool Queue :: IsEmpty(){
    return QueueLen == 0;
}
 
bool Queue :: IsFull(){
    return QueueLen == MaxQueueLen;
}
 
int Queue :: GetCount(){
    return QueueLen;
}
 
void Queue :: Add(int c){
    if(!IsFull()){
        Wait[QueueLen++] = c;
    }
}
 
int Queue :: Extract(){
    if(!IsEmpty()){
        int temp;
        temp = Wait[0];
        for(int i = 0; i < QueueLen - 1; i++)
            Wait[i] = Wait[i + 1];
        QueueLen--;
        return temp;
    }else{
        cout << "\nQueue is empty.";
        return -1;
    } 
}
 
class QueueRound : public Queue
{
public:
    QueueRound(int m){
        Queue(m);
    }
    ~QueueRound(){
        ~Queue();
    }
    int Extract(){
        if(!IsEmpty()){
            int temp = Wait[0];
            for (int i = 0; i < QueueLen - 1; ++i)
            {
                Wait[i] = Wait[i + 1];
            }
            Wait[QueueLen - 1] = temp;
 
            return temp; 
        }else{
            cout << "Queue is empty";
            return -1;
        }
    }
};
 
int main(){
    srand(time(NULL));
 
    Queue QU(25);
 
    for (int i = 0; i < 10; ++i)
    {
        QU.Add(rand() % 50);
    }
 
    QU.Show();
    QU.Extract();
    QU.Show();
 
    cout << "\nQueueRound\n---------------------------------------------------\n";
 
    QueueRound QR(15);
    for (int i = 0; i < 10; ++i)
    {
        QR.Add(rand() % 50);
    }
 
    QR.Show();
    QR.Extract();
    QR.Show();
 
    return 0;
}
Компилятор gcc. Выдает ошибку:
Кликните здесь для просмотра всего текста
gcc ./queue.cpp -o ./queue
./queue.cpp: In constructor ‘QueueRound::QueueRound(int)’:
./queue.cpp:80:19: error: no matching function for call to ‘Queue::Queue()’
QueueRound(int m){
^
./queue.cpp:80:19: note: candidates are:
./queue.cpp:35:1: note: Queue::Queue(int)
Queue :: Queue(int m){
^
./queue.cpp:35:1: note: candidate expects 1 argument, 0 provided
./queue.cpp:7:7: note: Queue::Queue(const Queue&)
class Queue{
^
./queue.cpp:7:7: note: candidate expects 1 argument, 0 provided
./queue.cpp:81:10: error: declaration of ‘Queue m’ shadows a parameter
Queue(m);
^
./queue.cpp:81:10: error: no matching function for call to ‘Queue::Queue()’
./queue.cpp:81:10: note: candidates are:
./queue.cpp:35:1: note: Queue::Queue(int)
Queue :: Queue(int m){
^
./queue.cpp:35:1: note: candidate expects 1 argument, 0 provided
./queue.cpp:7:7: note: Queue::Queue(const Queue&)
class Queue{
^
./queue.cpp:7:7: note: candidate expects 1 argument, 0 provided
./queue.cpp: In destructor ‘QueueRound::~QueueRound()’:
./queue.cpp:84:10: error: no matching function for call to ‘Queue::Queue()’
~Queue();
^
./queue.cpp:84:10: note: candidates are:
./queue.cpp:35:1: note: Queue::Queue(int)
Queue :: Queue(int m){
^
./queue.cpp:35:1: note: candidate expects 1 argument, 0 provided
./queue.cpp:7:7: note: Queue::Queue(const Queue&)
class Queue{
^
./queue.cpp:7:7: note: candidate expects 1 argument, 0 provided

Ошибка где-то в конструкторе(как я понимаю, компилятор не может разпознать аргумент). Но почему она возникает и как ее устранить, я не могу понять. Подскажите пожалуйста.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.08.2014, 00:33     Создать на базе класса с реализацией очереди клас потомок — кольцевая очередь
Посмотрите здесь:

Кольцевая однонаправленная очередь C++
C++ Очередь С++ Проблема с удалением элементов класса очереди
C++ Очередь: Создать две новые очереди в которых будут находиться отдельно положительные и отрицательные числа
C++ можно ли считать данный код реализацией очереди
На основе созданного класса OPERATION, создать класс-потомок OP_SUMMATOR, который производит сложение двух полей C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
15.08.2014, 00:38     Создать на базе класса с реализацией очереди клас потомок — кольцевая очередь #2
C++
1
2
QueueRound(int m) : Queue(m) { }
~QueueRound() { }
L3xx__
1 / 1 / 0
Регистрация: 17.11.2013
Сообщений: 17
15.08.2014, 00:44  [ТС]     Создать на базе класса с реализацией очереди клас потомок — кольцевая очередь #3
Вопрос относительно деструктора.
C++
1
~QueueRound() { }
Он вызывает деструктор отцовского класса, а тот в свою очередь высвобождает память?
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
15.08.2014, 00:56     Создать на базе класса с реализацией очереди клас потомок — кольцевая очередь #4
Цитата Сообщение от L3xx__ Посмотреть сообщение
деструктор отцовского класса
Для описания иерархии в C++ приняты термины: "базовый класс" и "производный класс".
Деструктор класса всегда неявно вызывает деструкторы базовых классов, а так же членов класса. Явный вызов деструкторов требуется в очень редких случаях.
В данном случае не помешало бы сделать деструктор базового класса виртуальным. Хотя, если не используется полиморфное удаление (delete), то это не обязательно.
А в производном классе можно вообще не реализовывать деструктор вручную, т.к. никаких специфических действий не требуется и подойдет версия, сгенерированная автоматически компилятором.
Yandex
Объявления
15.08.2014, 00:56     Создать на базе класса с реализацией очереди клас потомок — кольцевая очередь
Ответ Создать тему
Опции темы

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