Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 22, средняя оценка - 4.86
outoftime
║XLR8║
511 / 433 / 33
Регистрация: 25.07.2009
Сообщений: 2,295
#1

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

13.12.2009, 16:50. Просмотров 2882. Ответов 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
Здравствуйте! Я подобрал для вас темы с ответами на вопрос шаблоны в си++ (C++):

«Шаблоны шаблонов» vs «шаблоны с параметрами-шаблонами». - C++
«Шаблоны шаблонов» vs «шаблоны с параметрами-шаблонами». Есть ли разница в этих понятиях? Если есть, то в чём? И где (в каких...

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

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

Шаблоны C++ - C++
Написал template на С++, но он нифига не компилица, пишет мол типа не могу string в int преобразовать в строчке int out_param = (int)param;...

Шаблоны - C++
Я разбираюсь с ООП в С++ и застрял на шаблонах, будьте добры приведите пример кода, к примеру там.... вес машины и шаблон,(ну вообщем на...

Шаблоны - C++
// ConsoleApplication176.cpp : Defines the entry point for the console application. // template&lt;class type&gt; struct link { type...

22
Nick Alte
Эксперт С++
1642 / 1014 / 119
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
13.12.2009, 17:20 #2
Здесь сделано так, что каждый конкретный вариант стека работает только с одним типом данных. Если уж описал где mstack<int>, так только int туда и сможешь класть. Так что если надо производить "определение типа введенных данных и в зависимости от них кадать в стек элемент того или ониго типа", предложенная реализация совершенно не подходит. Для реализации стека, принимающего значения разного типа, придётся делать универсальный тип, способный вмещать значения всех требуемых типов (вроде Variant).
1
outoftime
║XLR8║
511 / 433 / 33
Регистрация: 25.07.2009
Сообщений: 2,295
13.12.2009, 18:16  [ТС] #3
жаль что никто не знает.. все что я наше это дебри
0
Андрейка
420 / 224 / 27
Регистрация: 25.03.2009
Сообщений: 744
13.12.2009, 18:29 #4
outoftime, если хочешь хранить объекты разных типов данных то придётся юзать boost::any но для этого придётся дистриб буста качать.
1
Rififi
2360 / 1053 / 44
Регистрация: 03.05.2009
Сообщений: 2,656
13.12.2009, 18:45 #5
Андрейка,

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

а смысл в таком хранении? всё равно неизвестно, чё потом с этими объектами делать.
1
Андрейка
420 / 224 / 27
Регистрация: 25.03.2009
Сообщений: 744
13.12.2009, 18:54 #6
Rififi, хотя да , ты прав
0
outoftime
║XLR8║
511 / 433 / 33
Регистрация: 25.07.2009
Сообщений: 2,295
13.12.2009, 20:01  [ТС] #7
известно: вывести в обратном порядке :0

+ хотелось разобраться что к чему..
0
CyBOSSeR
Эксперт С++
2305 / 1675 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
13.12.2009, 20:07 #8
outoftime, у тебя есть задание на данную работу?
Ты уверен что стек должен содержать элементы различного типа?
1
outoftime
║XLR8║
511 / 433 / 33
Регистрация: 25.07.2009
Сообщений: 2,295
13.12.2009, 20:20  [ТС] #9
на парах мы учим паскаль (до нового года), си/си++ мне надо "для себя" + на нем будет курсач, да и никто вроде не запрещает знать много, хотя и невозможно знать все..
касательно скорости работы, так оказалось что шаблон пашет так медленно, что можно увидеть задержки после ввода данных, в то время как структуры работают практически моментально (задержек не видно)..

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

И еще - является ли класс шаблонным или нет - это никак не влияет на скорость программы. Почитай про шаблоны более внимательно.
1
outoftime
║XLR8║
511 / 433 / 33
Регистрация: 25.07.2009
Сообщений: 2,295
13.12.2009, 20:38  [ТС] #11
разного типа, контейнер есть
0
CyBOSSeR
Эксперт С++
2305 / 1675 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
13.12.2009, 20:57 #12
outoftime, для чего тебе это нужно?
Ну запихну я туда число, строку, битмап, указатель массив и что я с этой солянкой делать буду?
1
outoftime
║XLR8║
511 / 433 / 33
Регистрация: 25.07.2009
Сообщений: 2,295
13.12.2009, 21:06  [ТС] #13
ты сначала запихни а потом хвастайся
0
CyBOSSeR
Эксперт С++
2305 / 1675 / 86
Регистрация: 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║
511 / 433 / 33
Регистрация: 25.07.2009
Сообщений: 2,295
13.12.2009, 21:42  [ТС] #15
ладно, я пас с таким играться.. оно компилится?.. ладно, о шаблонах узнал что хотел, а как преобразовывается тип надо посмотреть с пхп, там реализирована похожая технология.. предлагаю считать тему закрытой, в силу трудоемкости..
0
13.12.2009, 21:42
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.12.2009, 21:42
Привет! Вот еще темы с ответами:

Шаблоны - C++
ругается на строку &quot;friend class List&lt;T&gt;;&quot;, вот что пишет: 1&gt;c:\users\slava\documents\visual studio...

Шаблоны - C++
Когда разделяю реализацию и прототип шаблонной в функции по разным файлам (*.h и *.cpp) происходит ошибка линковки... Я так понимаю, делать...

Шаблоны С++ - C++
template &lt;typename T_sizeCapacity&gt; class SomeClass { public: T_sizeCacity size; }; Как сделать чтобы T_sizeCapacity мог быть...

Шаблоны - C++
Не пойму что я неправильно делаю. Как не переделывал, всё равно не получалось. Может кто сможет чем помочь. А задача следующая-надо было...


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

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

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