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

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

Войти
Регистрация
Восстановить пароль
 
alexsvk
8 / 8 / 1
Регистрация: 15.07.2010
Сообщений: 255
#1

Работы с фабрикой объектов - C++

31.07.2010, 18:48. Просмотров 644. Ответов 0
Метки нет (Все метки)

Нужно создать иерархию классов с абстрактным классом DataStruct на её вершине. В основании иерархии создать два проиводных класса. В одном - стек, во-втором - очередь. Так же должна быть фабрика создания объектов DataStructFactory(), которая должна создавать стек, если параметр метка... и т.д.
Привожу свой код. Вопрос у меня в следующем: для каждого производного класса создаю конструкторы, но при этом размер стека и очереди хранится в базовом классе. Когда функция, фабрика объектов, возвращает новый тип данных указателю на базовый класс в основной программе, то как создать объект с параметрами на основе этого указателя, ведь он не будет ничего создавать, а только лишь указывать на один из производных классов? Другими словами, как мне создавать новые стек и очередь с вызовом конструктора, при этом пользуясь этой функцией, указанной в задании?

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
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
//stdafx.h
 
#include "DataStruct.h"
#include "Stack.h"
#include "Queue.h"
 
#include <iostream>
#include <cstdlib>
#include <typeinfo>
#include <iomanip>
using namespace std;
 
DataStruct* DataStructFactory(char);
ostream& prank(ostream&);
ostream& chtp(ostream&);
 
//stdafx.cpp
 
ostream& prank(ostream& stream)
{
    stream<<"Press any key to continue...";
 
    return stream;
}
 
ostream& chtp(ostream& stream)
{
    stream<<setw(strlen("Choose the type of your data structure...\n\n")/2)<<"Choose the type of your data structure...\n\n";
    stream<<"Double - d\n";
    stream<<"Int - i\n";
    stream<<"Char - c\n-> ";
 
    return stream;
}
 
DataStruct* DataStructFactory(char ch)
{
    try {
        if (ch == 's')
            return new Stack;
        else 
            return new Queue;
    }
 
    catch (bad_alloc ba) {
        cout<<"Memory allocation error!\n";
        return NULL;
    }
 
    return NULL;
}
 
 
 
// Описание классов
 
template <class StructType> class DataStruct  
{
protected:
    int size;
public:
    DataStruct() {}
    DataStruct(int s) 
    {
        size = s;  
    }
    virtual ~DataStruct() { delete [] arr; }
 
    virtual void put(StructType) = 0;
    virtual StructType get(bool&) = 0;
    virtual StructType show() = 0;
};
 
template <class StructType> class Queue  : public DataStruct<StructType>
{
    int tail, head;
    StructType q;
public:
    Queue() {}
    Queue(int): DataStruct<StructType> (int); 
    virtual ~Queue()
 
    void put(StructType);
    StructType get(bool&);
 
};
Queue::~Queue()
{
    delete [] queue;
}
 
template <class StructType>
Queue Queue<StructType>::Queue(int s): DataStruct<StructType>(s)
{
    tail = head = 0;
 
    try {
        q = new StructType [size];
    }
 
    catch (bad_alloc ba) {
        system("cls");
        cout<<"Memory allocation error!\n";
        exit(1);
    }
}
 
template <class StructType>
void Queue<StructType>::put(StructType sym)
{
    try {
        if ((tail + 1 == size && head == 0) || tail + 1 == head)
            throw 0;
    }
 
    catch (int) {
    {
        cout<<"The queue is full!\n";
        return;
    }
 
    tail++;
 
    if(tail == size) tail = 0;
 
    q[tail] = sym;
 
}
 
template <class StructType>
StructType Queue<StructType>::get(bool &f)
{
 
    try {
        if (head == tail) throw 0;
    }
 
    catch (int) {
        f = false;
        cout<<"The queue is empty!\n";
        return 0;
    }
 
    head++;
 
    if (head == size) head = 0;
 
    return q[head];
 
}
 
 
 
template <class StructType> class Stack  : public DataStruct<StructType>
{
    int tos;
    StructType stck;
public:
    Stack() {};
    Stack(int): DataStruct<StructType>(int);
    virtual ~Stack();
 
    void put(StructType);
    StructType get(bool&);
 
};
Stack::~Stack()
{
    delete [] stck;
}
 
template <class StructType>
Stack Stack<StructType>::Stack(int s): DataStruct<StructType>(s)
{
    tos = 0;
 
    try {
        stck = new StructType [size];
    }
 
    catch (bad_alloc ba) {
        system("cls");
        cout<<"Memory allocation error!\n";
        exit(1);
    }
}
 
template <class StructType>
void Stack<StructType>::put(StructType sym)
{
    try {
        if(tos == size) throw 0;
    }
 
    catch (int) {
    {
        cout<<"The stack is full!\n";
        return;
    }
 
    stck [tos] = sym;
 
    tos++;
}
 
template <class StructType>
StructType Stack<StructType>::get(bool &f)
{
    try {
        if (!tos) throw 0;
    }
 
    catch (int) {
        f = false;
        cout<<"The stack if empty!\n";
        return 0;
    }
 
    tos --;
 
    return stck [tos];
}

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
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
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
// Ch12_main_3.cpp : Defines the entry point for the console application.
//
 
#include "stdafx.h"
 
 
int main(int argc, char* argv[])
{
    char c = '0'; int i = 0; double d = 0;
 
    char ch;
    bool flag = true;
    char type;
    int sz;
 
    do{
        system("cls");
        cout<<"Create stack - s\n";
        cout<<"Create queue - q\n";
        cout<<"Press Esc to exit\n-> ";
        fflush(stdin);
        cin>>ch;
 
        switch (ch)
        {
            case 's':
            {
                for(;;)
                {
                    do{
                        system("cls");
                        cout<<chtp;
                        fflush(stdin);
                        cin>>type;
                    }while(type != 'd' || type != 'i' || type != 'c')
                    
                    system("cls");
                    cout<<"Enter the size of stack: ";
                    fflush(stdin);
                    cin>>sz;
                    
                    if(type == 'd')
                        Stack<double> ob(sz);
                    else 
                        if (type == 'i')
                            Stack<int> ob(sz);
                        else
                            Stack<char> ob(sz);
                        
                    p = DataStructFactory(ch);
 
                    for(;;)
                    {
                        system("cls");
                        cout<<"Pop from stack - g\n";
                        cout<<"Push in stack p\n";
                        cout<<"Press Esc to proceed in the main menu\n-> ";
                        fflush(stdin);
                        cin>>ch;
 
                        if (ch == 27)
                            break;
                        
                        if (ch == 'g')
                        {
                            system("cls");
                            if(type == 'd') 
                            {
                                d = p->get(flag);
                                if(flag)
                                    cout<<"Symbol from stack: "<<d<<"\n";
                                cout<<prank;
                                getch();
                            }
                            else 
                                if (type == 'i')
                                {
                                    i = p->get(flag);
                                    if(flag)
                                        cout<<"Symbol from stack: "<<i<<"\n";
                                    cout<<prank;
                                    getch();
                                }
                                else
                                {
                                    c = p->get(flag);
                                    if(flag)
                                    cout<<"Symbol from stack: "<<c<<"\n";
                                    cout<<prank;
                                    getch();
                                }
                        }
                        else
                            if (ch == 'p')
                            {
                                system("cls");
                                cout<<"Enter the symbol: ";
                                fflush(stdin);
                                if (type == 'i')
                                {
                                    cin>>i;
                                    p->put(i);
                                }
                                else 
                                    if (type == 'd')
                                    {
                                        cin>>d;
                                        p->put(d);
                                    }
                                    else
                                    {
                                        cin>>c;
                                        p->put(c);
                                    }
                                cout<<prank;
                                getch();
                            }
                    }
                }   
            }
            break;
 
            case 'q'
            {
                for(;;)
                {
                    do{
                        system("cls");
                        cout<<chtp;
                        fflush(stdin);
                        cin>>type;
                    }while(type != 'd' || type != 'i' || type != 'c')
                    
                    system("cls");
                    cout<<"Enter the size of queue: ";
                    fflush(stdin);
                    cin>>sz;
                    
                    if(type == 'd')
                        Queue<double> ob(sz);
                    else 
                        if (type == 'i')
                            Queue<int> ob(sz);
                        else
                            Queue<char> ob(sz);
                        
                    p = DataStructFactory(ch);
                    
 
                    for(;;)
                    {
                        system("cls");
                        cout<<"Get element from queue - g\n";
                        cout<<"Add element in queue - p\n";
                        cout<<"Press Esc to proceed in the main menu\n-> ";
                        fflush(stdin);
                        cin>>ch;
 
                        if (ch == 27)
                            break;
                        
                        if (ch == 'g')
                        {
                            system("cls");
                            if(type == 'd') 
                            {
                                d = p->get(flag);
                                if(flag)
                                    cout<<"Symbol from queue: "<<d<<"\n";
                                cout<<prank;
                                getch();
                            }
                            else 
                                if (type == 'i')
                                {
                                    i = p->get(flag);
                                    if(flag)
                                        cout<<"Symbol from queue: "<<i<<"\n";
                                    cout<<prank;
                                    getch();
                                }
                                else
                                {
                                    c = p->get(flag);
                                    if(flag)
                                    cout<<"Symbol from queue: "<<c<<"\n";
                                    cout<<prank;
                                    getch();
                                }
                        }
                        else
                            if (ch == 'p')
                            {
                                system("cls");
                                cout<<"Enter the symbol: ";
                                fflush(stdin);
                                if (type == 'i')
                                {
                                    cin>>i;
                                    p->put(i);
                                }
                                else 
                                    if (type == 'd')
                                    {
                                        cin>>d;
                                        p->put(d);
                                    }
                                    else
                                    {
                                        cin>>c;
                                        p->put(c);
                                    }
                                cout<<prank;
                                getch();
                            }
                    }
            }
            break;
        }
    
    }while(ch != 27);
 
    delete [] p;
 
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.07.2010, 18:48     Работы с фабрикой объектов
Посмотрите здесь:

Программа для работы с массивом объектов типа Worker (работник) - C++
Здравствуйте! дали такое интересное задание: Worker: Фамилия и инициалы, Должность, Год поступления на работу, Зарплата. Создать...

Целью работы является создание программы для обработки набора объектов с использованием класса -контейнера - C++
Целью работы является создание програмки для обработки набора объектов с использованием класса -контейнера динамический массив ( vector...

Реализовать поиск по заданному полю в массиве объектов типа Рейс (моделирование работы справочной автовокзала) - C++
В справочной автовокзала хранится расписание движения автобусов. Для каждого рейса указаны: номер рейса; тип автобуса; пункт назначения;...

Переделать код для работы с файловым вводом/выводом (работа с массивом объектов пользовательского типа) - C++
Доброго времени суток! Можно ли переделать эту прогу на работу с файлом при помощи потоковых функций ввода вывода, подключаемых библиотекой...

Движение объектов - C++
Здравствуйте друзья, мне нужна помощь в написании программы C++ Нужно сделать объект, который будет двигаться по экрану: Движение под...

Вычитание объектов - C++
Привет всем! Помогите пожалуйста решить проблему: при выполнение в функции main вычитания - вылетает ошибка. В чём проблема? ...

Масив объектов - C++
Вот читаю тему массив объектов. набрал небольшой код, но программ не идёт. #include &lt;iostream&gt; using namespace std; class...

Моделирование 3D объектов - C++
Доброго всем дня. Я новичок в программировании ... поэтому если кому то мой вопрос покажется глупым - не глумится ... Озы С++...

Взаимодействие объектов - C++
При написании менеджера объектов для движка столкнулся с проблемой взаимодействия объектов между собой. Например есть классы Player и...

массив объектов - C++
добрый вечер всем. Возникла такая проблема - необходимо создать массив деков символов. Я хочу создать пустой объект - нулевого размера. а...

Дерево объектов - C++
Есть задание: Массив из n элементов, каждый из которых уникальный экземпляр, включающий как минимум 3 атрибута. Необходимо произвести отбор...

Массив объектов - C++
Задумка: Сделать некую подобию базы данных, список из &quot;объектов&quot;. К объектам привязаны соответствующие данные разных типов (int, char и...


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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

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