Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.93/15: Рейтинг темы: голосов - 15, средняя оценка - 4.93
outoftime
║XLR8║
756 / 656 / 211
Регистрация: 25.07.2009
Сообщений: 3,289
Записей в блоге: 5
#1

шаблоны в си++

13.12.2009, 16:50. Просмотров 2949. Ответов 22
Метки нет (Все метки)

Здравствуйте, я уже сутки пытаюсь переписать стек так, что-бы можно было испольовать все возможные типы данных для элементов стека. Если я верно понял нужно использовать шаблоы, пытался но ничего не вышло.. Если кто знает как ето реализировать буду очень признателен.. Вот
код
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
#include <iostream>
 
using namespace std;
 
struct node
{
    int inf;
    node* next;
};
 
class stack
{
public:
    stack(){head = NULL;}
    ~stack(){}
    void push(int &val)
    {
        node* tmp = new node;
        tmp->inf = val;
        tmp->next = head;
        head = tmp;
    }
    int pop()
    {
        int val = head->inf;
        node* tmp = head;
        head = head->next;
        delete head; 
        return val;
    }
    void clear()
    {
        while (head->next != NULL)    
        {
            node* tmp = head;
            head = head->next;
            delete tmp;
        }
        head = NULL;
    }
    bool empty() {return (head == NULL);}
private:
    node* head;    
};
 
int main()
{
    int val, key;
    stack top;
    
    do
    {
        system("cls");
        cout << "\tStack\t\t\t\tmade by TFTM\n\n";
        cout << "1 - push\n";
        cout << "2 - pop & write\n";
        cout << "3 - exit\n\n";
        cout << "press key: ";
        cin >> key;
        switch (key)
        {
            case 1:
                {
                    cout << "\nenter element: ";
                    cin >> val;
                    top.push(val);
                    break;    
                }
            case 2:
                {
                    if (top.empty()) cout << "stack is empty..";
                    else
                    {
                        cout << "poping:\n";
                        while (!top.empty())
                            cout << top.pop() << endl;
                    }
                    system("pause");
                    break;    
                }
            default:
                {
                    if (key == 3) cout << "exiting succesfully..\n";
                    else cout << "press only 1, 2 or 3\n";
                    system("pause");
            }                
        }
    }
    while (key != 3);
    
    return 0;    
}


Добавлено через 40 минут
На шаблон переделано, осталось как-то реализовать определение типа введенных данных и в зависимости от них кадать в стек элемент того или ониго типа..
mstack.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
45
46
template <typename T>
struct node
{
    T inf;
    node<T>* next;
};
 
template <typename T>
class mstack
{
private:
    node<T>* head;
public:
    mstack(){head = NULL;}
    ~mstack(){}
    
    void push(T &val)
    {
        node<T>* tmp = new node<T>;
        tmp->inf = val;
        tmp->next = head;
        head = tmp;
    }
    
    void clear()
    {
        while (head->next != NULL)
        {
            node<T>* tmp = head;
            head = head->next;
            delete tmp;
        }
        head = NULL;
    }
    
    bool empty(){return (head == NULL);}
    
    T pop()
    {
        T res = head->inf;
        node<T>* tmp = head;
        head = head->next;
        delete tmp;
        return res;
    }
};

mstack.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
#include <iostream>
#include "mstack.h"
 
using namespace std;
 
int main()
{
    mstack <int> s;
    int val, key;
    do
    {
        system("cls");
        cout << "\tStack\t\t\t\tmade by TFTM\n\n";
        cout << "1 - push\n";
        cout << "2 - pop & write\n";
        cout << "3 - exit\n\n";
        cout << "press key: ";
        cin >> key;
        switch (key)
        {
            case 1:
                {
                    cout << "\nenter element: ";
                    cin >> val;
                    s.push(val);
                    break;    
                }
            case 2:
                {
                    if (s.empty()) cout << "stack is empty..";
                    else
                    {
                        cout << "poping:\n";
                        while (!s.empty())
                            cout << s.pop() << endl;
                    }
                    system("pause");
                    break;    
                }
            default:
                {
                    if (key == 3) cout << "exiting succesfully..\n";
                    else cout << "press only 1, 2 or 3\n";
                    system("pause");
            }                
        }
    }
    while (key != 3);
    
    return 0;
}

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

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.12.2009, 16:50
Ответы с готовыми решениями:

«Шаблоны шаблонов» vs «шаблоны с параметрами-шаблонами».
«Шаблоны шаблонов» vs «шаблоны с параметрами-шаблонами». Есть ли разница в...

Шаблоны. Плохо понимаемые моменты из книги "Шаблоны С++. Справочник разработчика". (Вандевурд, Джосаттис)
Так как изучаю эту книгу, то в некоторых местах возникают вопросы. Чтобы не...

Помогите писать на С++ через шаблоны. Консуле я писал, но надо писать исползуя шаблоны
В одномерном массиве, состоящем из п вещественных элементов, вычислить: 1)...

Шаблоны в C++
Здравствуйте! Написал такой код: #include &lt;QtCore/QCoreApplication&gt;...

Шаблоны
Так делать типо нельзя ? template&lt;class T, int maxPrint = 10&gt; void...

22
Nick Alte
Эксперт С++
1647 / 1019 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
13.12.2009, 17:20 #2
Здесь сделано так, что каждый конкретный вариант стека работает только с одним типом данных. Если уж описал где mstack<int>, так только int туда и сможешь класть. Так что если надо производить "определение типа введенных данных и в зависимости от них кадать в стек элемент того или ониго типа", предложенная реализация совершенно не подходит. Для реализации стека, принимающего значения разного типа, придётся делать универсальный тип, способный вмещать значения всех требуемых типов (вроде Variant).
1
outoftime
║XLR8║
756 / 656 / 211
Регистрация: 25.07.2009
Сообщений: 3,289
Записей в блоге: 5
13.12.2009, 18:16  [ТС] #3
жаль что никто не знает.. все что я наше это дебри
0
Андрейка
421 / 225 / 87
Регистрация: 25.03.2009
Сообщений: 744
13.12.2009, 18:29 #4
outoftime, если хочешь хранить объекты разных типов данных то придётся юзать boost::any но для этого придётся дистриб буста качать.
1
Rififi
2363 / 1056 / 104
Регистрация: 03.05.2009
Сообщений: 2,656
13.12.2009, 18:45 #5
Андрейка,

если хочешь хранить объекты разных типов данных то придётся юзать boost::any но для этого придётся дистриб буста качать.

а смысл в таком хранении? всё равно неизвестно, чё потом с этими объектами делать.
1
Андрейка
421 / 225 / 87
Регистрация: 25.03.2009
Сообщений: 744
13.12.2009, 18:54 #6
Rififi, хотя да , ты прав
0
outoftime
║XLR8║
756 / 656 / 211
Регистрация: 25.07.2009
Сообщений: 3,289
Записей в блоге: 5
13.12.2009, 20:01  [ТС] #7
известно: вывести в обратном порядке :0

+ хотелось разобраться что к чему..
0
CyBOSSeR
Эксперт С++
2309 / 1682 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
13.12.2009, 20:07 #8
outoftime, у тебя есть задание на данную работу?
Ты уверен что стек должен содержать элементы различного типа?
1
outoftime
║XLR8║
756 / 656 / 211
Регистрация: 25.07.2009
Сообщений: 3,289
Записей в блоге: 5
13.12.2009, 20:20  [ТС] #9
на парах мы учим паскаль (до нового года), си/си++ мне надо "для себя" + на нем будет курсач, да и никто вроде не запрещает знать много, хотя и невозможно знать все..
касательно скорости работы, так оказалось что шаблон пашет так медленно, что можно увидеть задержки после ввода данных, в то время как структуры работают практически моментально (задержек не видно)..

CyBOSSeR, однотипные я уже 5 разных реализовал с разными подходами..
0
CyBOSSeR
Эксперт С++
2309 / 1682 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
13.12.2009, 20:27 #10
outoftime, ты немного не понял... Должен ли стек хранить элементы различного типа (первый элемент - целое, второй - вещественное и т.д.) или быть универсальным контейнером (хочешь чтоб хранил целые - будет хранить целые, хочешь вещественные - будет хранить вещественные).

И еще - является ли класс шаблонным или нет - это никак не влияет на скорость программы. Почитай про шаблоны более внимательно.
1
outoftime
║XLR8║
756 / 656 / 211
Регистрация: 25.07.2009
Сообщений: 3,289
Записей в блоге: 5
13.12.2009, 20:38  [ТС] #11
разного типа, контейнер есть
0
CyBOSSeR
Эксперт С++
2309 / 1682 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
13.12.2009, 20:57 #12
outoftime, для чего тебе это нужно?
Ну запихну я туда число, строку, битмап, указатель массив и что я с этой солянкой делать буду?
1
outoftime
║XLR8║
756 / 656 / 211
Регистрация: 25.07.2009
Сообщений: 3,289
Записей в блоге: 5
13.12.2009, 21:06  [ТС] #13
ты сначала запихни а потом хвастайся
0
CyBOSSeR
Эксперт С++
2309 / 1682 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
13.12.2009, 21:19 #14
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
std::vector<void*> very_unsafe_vector; // очень небезопасный вектор
 
int     int_number    = 0;
float   float_number  = 0.0f;
double  double_number = 0.0;
char    string[]      = "Some string";
CBitmap bitmap;
 
very_unsafe_vector.push_back((void*)&int_number);
very_unsafe_vector.push_back((void*)&float_number);
very_unsafe_vector.push_back((void*)&double_number);
very_unsafe_vector.push_back((void*)string);
very_unsafe_vector.push_back((void*)&bitmap);
Запихнул... Что дальше? Как с этим работать будем?
1
outoftime
║XLR8║
756 / 656 / 211
Регистрация: 25.07.2009
Сообщений: 3,289
Записей в блоге: 5
13.12.2009, 21:42  [ТС] #15
ладно, я пас с таким играться.. оно компилится?.. ладно, о шаблонах узнал что хотел, а как преобразовывается тип надо посмотреть с пхп, там реализирована похожая технология.. предлагаю считать тему закрытой, в силу трудоемкости..
0
CyBOSSeR
Эксперт С++
2309 / 1682 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
13.12.2009, 22:01 #16
outoftime, посмотреть надо не в пхп, а в книгах, посвященных C++.
Контейнер который ты хотел создать небезопасен и очень очень неудобен, так что лучше забей на него, если в нем нет необходимости.
1
outoftime
║XLR8║
756 / 656 / 211
Регистрация: 25.07.2009
Сообщений: 3,289
Записей в блоге: 5
13.12.2009, 22:15  [ТС] #17
а почему небезовасен? (в моем коде)
0
CyBOSSeR
Эксперт С++
2309 / 1682 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
13.12.2009, 22:38 #18
Твой универсальный стек безопасен, т.к. одновременно он может содержать элементы только одного типа (в зависимости от типа передаваемого в качестве параметра шаблона при создании).
А вот стек который одновременно может содержать элементы различного типа небезопасен только тем фактом что тип элементов неизвестен, соответственно, практически никакая операция не может быть выполнена над ними безопасно. Предположим, захочешь ты распечатать содержание стека, как ты будешь это делать?
1
outoftime
║XLR8║
756 / 656 / 211
Регистрация: 25.07.2009
Сообщений: 3,289
Записей в блоге: 5
13.12.2009, 23:54  [ТС] #19
проверять тип элемента
0
CyBOSSeR
Эксперт С++
2309 / 1682 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
13.12.2009, 23:57 #20
Два вопроса:
1. Каким образом проверять тип?
2. Ну определил ты что текущий элемент битмап, как ты его выведешь?
1
13.12.2009, 23:57
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.12.2009, 23:57

Шаблоны в C++
Доброго времени суток! Начал разбираться что такое шаблон и с чем его едят....

Шаблоны
Здравствуйте не объясните новичку пару аспектов про шаблоны 1)Зачем они нужны...

шаблоны
помогите с задачей пожалуйста нужно описать шаблон класса для хранения...


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

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

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