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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 25, средняя оценка - 4.88
GetHelp
-7 / 61 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
#1

Стек на шаблонах - оцените реализацию - C++

17.07.2014, 00:21. Просмотров 3412. Ответов 101
Метки нет (Все метки)

просто хочу узнать чужое мнение, написал стек через шаблоны, оцените реализацию
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
template <typename T>
class Stack
{
private:
    size_t size;
    T* data;
public:
    Stack();
    void Push(T value);
    T Pop();
};
 
template <typename T>
Stack<T>::Stack()
{
    size = sizeof(T);
    data = new T;
}
 
template <typename T>
void Stack<T>::Push(T value)
{
    data = data + size;
    *data = value;
}
 
template <typename T>
T Stack<T>::Pop()
{
    int tmp = *data;
    data = data - size;
    T* ptr = data + size;
    ptr = nullptr;
    return tmp;
}
Добавлено через 1 минуту
з.ы. сначала пытался париться как это в идеале надо prev, next (т.е. предыдущий и следующий элементы) потом забил, толку с них никакого, все равно по смещению ищу значение
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.07.2014, 00:21
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Стек на шаблонах - оцените реализацию (C++):

пытаюсь сделать реализацию через считывание из файла кол-ва чисел, i,но незнаю как сделать реализацию из файла в массив и сортировки. - C++
В файле input.txt находится неизвестное количество вещественных чисел в интервале . Выцапарать их оттуда, отсортировать по убыванию модуля...

ошибка в шаблонах функций - C++
Есть у меня программа из нескольких файлов . с шаблонами для функций ... компилятор выдает следующий ошибку -&gt; &quot;/main.cpp:17: undefined...

Дружественные функции в шаблонах - C++
Как использовать дружественные функции в шаблонах? ( C++ Builder)

Typename в шаблонах класса - C++
В таком шаблоне: template &lt;typename T, int n, bool islong=???&gt; class CounterA{... требуется распознать тип, то есть переменная islong...

Вопрос по исключениям в шаблонах классов - C++
Кто подскажет как реализовать исключения в следующей задаче: Создать шаблонный класс, в котором создать одномерный массив и найти...

Доступ к элементам tuple в шаблонах - C++
Собственно, не могу понять как работать с элементами кортежа в цикле, не получается получить к ним доступ. Подскажите, кто знает, как это...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
GetHelp
-7 / 61 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
17.07.2014, 19:05  [ТС] #61
Цитата Сообщение от 0x10 Посмотреть сообщение
Сам же уперся в то, что не знаешь что возвращать из функции pop. Ссылку нельзя - поскольку объект с вершины должен быть удален. Указатель - тоже нельзя, потенциальные утечки. Копию - необоснованные накладные расходы.
я не говорил что не знаю... я возвращаю указатель на копию я не понимаю о каких накладных речь выделяется всего лишь память на 1 элемент, который и возвращается функцией, а там уже что с ним будут делать не моя забота...
0x10
2460 / 1632 / 238
Регистрация: 24.11.2012
Сообщений: 4,015
17.07.2014, 19:06 #62
Цитата Сообщение от GetHelp Посмотреть сообщение
я не говорил что не знаю... я возвращаю указатель на копию
Про утечки памяти уже сказали.
GetHelp
-7 / 61 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
17.07.2014, 19:08  [ТС] #63
Цитата Сообщение от 0x10 Посмотреть сообщение
Про утечки памяти уже сказали.
я же их устранил
Цитата Сообщение от GetHelp Посмотреть сообщение
а да и правда потерял, вот так исправил
C++
1
2
3
4
5
6
7
8
9
10
11
template <typename T>
T* Stack<T>::Pop()
{
    if (!head) return nullptr;
    T *value = new T;
    *value = head->data;
    NODE *tmp = head;
    head = head->prev;
    delete tmp;
    return value;
}
а других утечек я не вижу...
0x10
2460 / 1632 / 238
Регистрация: 24.11.2012
Сообщений: 4,015
17.07.2014, 19:10 #64
Цитата Сообщение от GetHelp Посмотреть сообщение
а других утечек я не вижу...
Кто должен освобождать память, выделенную под value?
GetHelp
-7 / 61 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
17.07.2014, 19:10  [ТС] #65
Цитата Сообщение от 0x10 Посмотреть сообщение
Кто должен освобождать память, выделенную под value?
Цитата Сообщение от GetHelp Посмотреть сообщение
выделяется всего лишь память на 1 элемент, который и возвращается функцией, а там уже что с ним будут делать не моя забота...
тот кто вызывал функцию Pop очевидно
0x10
2460 / 1632 / 238
Регистрация: 24.11.2012
Сообщений: 4,015
17.07.2014, 19:12 #66
Цитата Сообщение от GetHelp Посмотреть сообщение
а там уже что с ним будут делать не моя забота
Значит, у библиотеки хреновый интрфейс, котороый провоцирует утечки памяти, ибо ответа на вопрос о ее освобождении нет.
GetHelp
-7 / 61 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
17.07.2014, 19:16  [ТС] #67
Цитата Сообщение от 0x10 Посмотреть сообщение
Значит, у библиотеки хреновый интрфейс, котороый провоцирует утечки памяти, ибо ответа на вопрос о ее освобождении нет.
что из фразы "тот кто вызывал функцию Pop" не понятно?

Добавлено через 3 минуты
и ДАЖЕ если я захочу переделать и сделать void Pop и соответственно какую нибудь T Peek, что вы предложите возвращать если стек пуст??? в этом весь вопрос...
0x10
2460 / 1632 / 238
Регистрация: 24.11.2012
Сообщений: 4,015
17.07.2014, 19:23 #68
Цитата Сообщение от GetHelp Посмотреть сообщение
что из фразы "тот кто вызывал функцию Pop" не понятно?
В общем случае объект может быть разделяемым между несколькими владельцами и его время жизни определяется временем жизни всех его владельцев.

Добавлено через 4 минуты
Цитата Сообщение от GetHelp Посмотреть сообщение
что вы предложите возвращать если стек пуст
Можно кинуть исключение или сказать, что это undefined behavior.
GetHelp
-7 / 61 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
17.07.2014, 19:26  [ТС] #69
Цитата Сообщение от 0x10 Посмотреть сообщение
Можно кинуть исключение или сказать, что это undefined behaviour.
а что такое undefined behaviour.
0x10
2460 / 1632 / 238
Регистрация: 24.11.2012
Сообщений: 4,015
17.07.2014, 19:29 #70
GetHelp, неопределенное поведение. В частности: разыменование нулевого указателя, выход за границы массива. Один из этих вариантов возможен и при попытке снятия объекта с пустого стека в зависимости от реализации нижележащего контейнера.
GetHelp
-7 / 61 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
17.07.2014, 19:40  [ТС] #71
0x10, вы имеете ввиду что то типа этого?

int32_t safe_div_int32_t (int32_t a, int32_t b)
или
int32_t unsafe_div_int32_t (int32_t a, int32_t b)

Добавлено через 27 секунд
вот тут нырыл http://blog.regehr.org/archives/213

Добавлено через 3 минуты
а исключение кинуть это что то типа throw(0)?
0x10
2460 / 1632 / 238
Регистрация: 24.11.2012
Сообщений: 4,015
17.07.2014, 19:40 #72
Я говорю о том, что получение доступа к элементу пустого контейнера есть исключительная ситуация, свидетельствующая о неправильном использовании библиотеки. Разработчик этой библиотеки может либо допускать такое использование и при попытке доступа тупо вылезать за границы памяти, либо генерировать исключение.
GetHelp
-7 / 61 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
17.07.2014, 19:41  [ТС] #73
Цитата Сообщение от 0x10 Посмотреть сообщение
либо генерировать исключение
Цитата Сообщение от GetHelp Посмотреть сообщение
а исключение кинуть это что то типа throw(0)?
10 символов
0x10
2460 / 1632 / 238
Регистрация: 24.11.2012
Сообщений: 4,015
17.07.2014, 19:41 #74
Цитата Сообщение от GetHelp Посмотреть сообщение
а исключение кинуть это что то типа throw(0)?
Кинет объект типа int, по которому будет невозможно понять что произошло. Из стандартных исключений наиболее подходящим кажется http://www.cplusplus.com/reference/s.../out_of_range/
GetHelp
-7 / 61 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
17.07.2014, 19:48  [ТС] #75
0x10, никак не пойму как его правильно заюзать, не подскажете?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.07.2014, 19:48
Привет! Вот еще темы с ответами:

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

Тип, зависимый от условия в шаблонах - C++
Возможно ли реализовать подобное: template &lt;uint8_t bits&gt; class test { // если bits &lt;= 8 typedef uint8_t storageType; //...

Используя стек, описать функцию проверяющую, является ли стек пустым - C++
Используя стек, описать функцию проверяющую, является ли стек пустым

Программа добавляет введенный массив 5*5 в стек и выводит полученный стек двумя столбцами - C++
Программа добавляет введенный массив 5*5 в стек и выводит полученный стек двумя столбцами #include &lt;iostream&gt; #include &lt;stdlib.h&gt; ...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
17.07.2014, 19:48
Закрытая тема Создать тему
Опции темы

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