Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
0 / 0 / 0
Регистрация: 09.10.2015
Сообщений: 22

Шаблонное наследование

14.03.2016, 21:52. Показов 1560. Ответов 20

Студворк — интернет-сервис помощи студентам
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
#include "stackcalculator.h"
#include <cstring>
#include "stack.h"
#include "pointerstack.h"
 
int length = 100;
 
template <typename T>
int priority(T c);
 
template <>
int priority<char>(char c)
{
    switch (c)
    {
    case '*':
    case '/':
        return 3;
 
    case '-':
    case '+':
        return 2;
    case '(':
        return 1;
    }
}
 
int priority(char c)
{
    switch (c)
    {
    case '*':
    case '/':
        return 3;
 
    case '-':
    case '+':
        return 2;
    case '(':
        return 1;
    }
}
 
char *FromInfixToPostfix(char entered[])
{
    char returned[length];
    for (int i = 0; i < length; ++i)
    {
        returned[i] = '\0';
    }
    PointerStack <char> *operations = new PointerStack<char>;
    int j = -1;
    for (int i = 0; i < strlen(entered); ++i)
    {
        if (entered[i] == ')')
        {
            char symbol = operations->pop();
            while (symbol != '(')
            {
                returned[++j] = symbol;
                symbol = operations->pop();
            }
        }
        else if ((entered[i] >= '0') && (entered[i] <= '9'))
        {
            returned[++j] = entered[i];
        }
        else if (entered[i] == '(')
        {
            operations->push('(');
        }
        else if ((entered[i] == '+') || (entered[i] == '*') || (entered[i] == '/') || (entered[i] == '-'))
        {
            if (operations->getSize() == 0)
            {
                operations->push(entered[i]);
            }
            else if (priority(operations->top->returnKey) < priority(entered[i]))
            {
                operations->push(entered[i]);
            }
            else
            {
                while ((operations->getSize() != 0) && (priority(operations->top->returnKey) >= priority(entered[i])))
                {
                    returned[++j] = operations->pop();
                }
                operations->push(entered[i]);
            }
        }
    }
    while (operations->getSize() != 0)
    {
        returned[++j] = operations->pop();
    }
}
arraystack.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#pragma once
#include "stack.h"
 
class ArrayStack : public Stack <int>
{
public:
    ArrayStack();
    bool push(int value);
    int pop();
    int getSize()
    {
        return size;
    }
    ~ArrayStack();
private:
    static int const maxArraySize = 256;
    int *array = new int[maxArraySize];
    int size = 0;
};
arraystack.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
#include "arraystack.h"
 
ArrayStack::ArrayStack()
    :size(0), array(new int[maxArraySize])
{}
 
bool ArrayStack::push(int value)
{
    if (size < maxArraySize)
    {
        array[++size] = value;
        return true;
    }
    else
    {
        return false;
    }
}
 
int ArrayStack::pop()
{
    if (size > 0)
    {
        int outputValue = array[size];
        array[size] = 0;
        --size;
        return outputValue;
    }
    else
    {
        return 0;
    }
}
 
ArrayStack::~ArrayStack()
{
    delete[] array;
}
pointerstack.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
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
#pragma once
#include <iostream>
 
template <typename T>
class PointerStack : public Stack <T>
{
public:
    PointerStack();
    bool push(T value);
    T pop();
    int getSize()
    {
        return size;
    }
    class ElementOfStack
    {
    public:
        ElementOfStack();
        ElementOfStack(T value)
        {
            key = value;
        }
 
        T returnKey()
        {
            return key;
        }
        T key;
        ElementOfStack *next;
    };
    ~PointerStack();
    ElementOfStack *top;
private:
    int size;
};
 
template <typename T>
PointerStack<T>::PointerStack()
    :size(0)
{
    top = new ElementOfStack();
}
 
template <typename T>
PointerStack<T>::ElementOfStack::ElementOfStack()
    :next(nullptr)
{}
 
template <typename T>
bool PointerStack<T>::push(T value)
{
    ElementOfStack *element = top;
    if(element)
    {
        ElementOfStack *auxiliary = new ElementOfStack(value);
        auxiliary->next = element;
        top = auxiliary;
    }
    else
    {
        element->key = value;
    }
    ++size;
    return true;
}
 
template <typename T>
T PointerStack<T>::pop()
{
    if(size > 0)
    {
        T outputValue = top->key;
        ElementOfStack *newTop = top->next;
        delete top;
        top = newTop;
        return outputValue;
    }
}
stack.h
C++
1
2
3
4
5
6
7
8
9
10
11
#pragma once
 
template <typename T>
class Stack
{
public:
    Stack();
    virtual bool push(T value);
    virtual T pop();
    virtual int getSize();
};
Ошибки:
undefined reference to `int priority<char (PointerStack<char>::ElementOfStack::*)( )>(char (PointerStack<char>::ElementOfStack::*)( ))'

undefined reference to `int priority<char (PointerStack<char>::ElementOfStack::*)( )>(char (PointerStack<char>::ElementOfStack::*)( ))'

undefined reference to `Stack<char>::Stack()'

undefined reference to `Stack<int>::Stack()'
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
14.03.2016, 21:52
Ответы с готовыми решениями:

Шаблонное наследование
Это не вопрос, просто выражение удивления у дилетанта. Я крайне удивился, когда такое сработало: #include &lt;iostream&gt; ...

Шаблонное дерево. Длиннейший путь.
Здравствуйте. Нужно написать метод, который бы возвращал длиннейший путь в шаблонном дереве в виде динамического массива элементов(путь...

Решение задачи через шаблонное выражение
Помогите направить меня на путь истины.Дана вот такая программа в двух файлах. Когда я задаю значения для переменных в выражениях vir1 и...

20
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12922 / 6789 / 1818
Регистрация: 18.10.2014
Сообщений: 17,176
15.03.2016, 03:28
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Almanack Посмотреть сообщение
Просто нас учили самим писать подобные структуры и прочее.
Это нормально. Как правило, в учебных заведения учат "классическому" С++ образца 1998 года, ибо именно ему посвящена основная масса литературы.

Но имейте в виду, что в "классическом" С++ вот такое не разрешается

C++
1
2
3
4
5
6
class ArrayStack : public Stack <int>
{
    ...
    int *array = new int[maxArraySize];
    int size = 0;
};
В "классическом" С++ инициализацию нестатических полей класса надо делать явно вручную в конструкторе, как это делаете вы в вашем конструкторе.

Поэтому я и спрашивал о том, хотите ли вы сохранить инициализаторы в определении класса. Понимаете ли вы, что:

1) Указывая эти инициализаторы в определении класса, вы тем самым используете одно из относительно новых, совсем "не классических" свойств языка С++, введенных в 2011 году?
2) Эти инициализаторы в определении класса в вашем случае вообще никакого эффекта не имеют, ибо вы все равно "переопределяете" их вручную в конструкторе?

Если вас учили делать все вручную, в стиле "классического" С++, и вы хотите делать именно так, то вот эта фишка с указанием инициализаторов для нестатических полей класса вам совершенно не нужна и избыточна. Она скорее мешает, чем помогает.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
15.03.2016, 03:28
Помогаю со студенческими работами здесь

Шаблонное вычисление типов и Variadic Templates
Можно ли сделать что-то вроде этого: Этот код, естественно, не компилируется: template&lt;typename T&gt; class mtd_parser; ...

Заменить наследование классов на наследование интерфейсов
#include &lt;iostream&gt; #include &lt;assert.h&gt; using namespace std; int people_on_base = 100; int vehicles_on_base = 100; double...

Шаблонное в аллокаторах
Разбираю стандартные аллокаторы и мне интересно узнать как понимать следующий typedef, как он работает? template &lt;class T, class A =...

Шаблонное наследование или как наследоваться от <T>?
Хочу всем стандартным контролам прикрутить дополнительные плюшки, вроде всплывающих подсказок, текст которых можно задавать им через...

Наследование шаблоном шаблона (наследование конструктора)
Всем привет! Думаю, что эта тема хоть и касается общих вопросов программирования, но будет уместна в данном разделе т.к. у различных...


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

Или воспользуйтесь поиском по форуму:
21
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru