Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/3: Рейтинг темы: голосов - 3, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 15.05.2012
Сообщений: 200
1

Шаблоны

03.12.2019, 06:16. Показов 531. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Проблема в My_vector.cpp строка 28, T num = T() должно инициальзироваться значением по умолчанию.

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
//My_vector.h
#ifndef MY_VECTOR_H
#define MY_VECTOR_H
 
#include <std_lib_facilities.h>
 
namespace My_space {
 
template <typename T, typename A = allocator<T>>
class My_vector {
    A alloc; //работает с памятью, выделяемой для элементов
    int sz; //размер
    T* elem; //указатель на элементы
    int space; //количество элементов + свободных слотов
public:
    My_vector()
        : sz { 0 }
        , elem { nullptr }
        , space { 0 }
    {
    }
    explicit My_vector(int s)
        : sz { s }
        , elem { new T[s] }
        , space { s }
    {
        for (int i = 0; i < sz; ++i)
            elem[i] = 0;
    }
    //копирующий конструктор и присваивание
    My_vector(const My_vector*);
    My_vector& operator=(const My_vector&);
 
    //перемещающий конструктор и присваивание
    My_vector(const My_vector&&);
    My_vector& operator=(const My_vector&&);
 
    ~My_vector() { delete[] elem; } //деструктор
 
    //доступ к элементам с проверкой диапозона
    T& at(int n);
    const T& at(int n) const;
 
    //доступ к элементам без проверки
    T& operator[](int n);
    const T& operator[](int n) const;
 
    int size() const { return sz; }
    int capacity() const { return space; }
 
    void resize(int newsize, T num = T());
    void push_back(T d);
    void reserve(int newalloc);
};
}
 
#endif // MY_VECTOR_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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
//My_vector.cpp
#include "My_vector.h"
#include <std_lib_facilities.h>
 
namespace My_space {
 
//A alloc; //работает с памятью, выделяемой для элементов
//int sz; //размер
//T* elem; //указатель на элементы
//int space; //количество элементов + свободных слотов
 
template <typename T, typename A>
void My_vector<T, A>::reserve(int newalloc)
{
    if (newalloc <= space)
        return;
    T* p = alloc.allocate(newalloc); //выделение новой памяти
    for (int i = 0; i < sz; ++i)
        alloc.construct(&p[i], elem[i]); //копирование
    for (int i = 0; i < sz; ++i)
        alloc.destroy(&elem[i]); //уничтожение
    alloc.deallocate(elem, space); //освобождаем старую память
    elem = p;
    space = newalloc;
}
 
template <typename T, typename A>
void My_vector<T, A>::resize(int newsize, T num = T())
{
    reserve(newsize);
    if (newsize > 0) {
        for (int i = sz; i < newsize; ++i)
            alloc.construct(&elem[i], num);
        for (int i = newsize; i < sz; ++i)
            alloc.destroy(&elem[i]);
        sz = newsize;
    }
    if (newsize == 0) {
        for (int i = newsize; i < sz; ++i)
            alloc.destroy(&elem[i]);
        sz = newsize;
    }
}
 
template <typename T, typename A>
void My_vector<T, A>::push_back(const T val)
{
    if (space == 0)
        reserve(8);
    else if (sz == space)
        reserve(2 * space);
    alloc.construct(&elem[sz], val);
    ++sz;
}
 
template <typename T, typename A>
My_vector<T, A>& My_vector<T, A>::operator=(const My_vector<T, A>& a)
{
    if (this == &a)
        return *this;
 
    if (a.sz <= space) {
        for (int i = 0; i < a.sz; ++i)
            elem[i] = a.elem[i];
        sz = a.sz;
        return *this;
    }
 
    double* p = new double[a.sz];
    for (int i = 0; i < a.sz; ++i)
        p[i] = a.elem[i];
    delete[] elem;
    space = sz = a.sz;
    elem = p;
    return *this;
}
 
template <typename T, typename A>
T& My_vector<T, A>::operator[](int n)
{
    return elem[n];
}
 
template <typename T, typename A>
T& My_vector<T, A>::at(int n)
{
    if (n >= 0 && n < sz)
        throw Range_error(n);
    return elem[n];
}
 
 
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.12.2019, 06:16
Ответы с готовыми решениями:

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

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

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

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

4
"C with Classes"
1646 / 1403 / 523
Регистрация: 16.08.2014
Сообщений: 5,877
Записей в блоге: 1
03.12.2019, 06:24 2
EvilingDark, шаблоны обычно не разделяют по разным файлам, и объявления и определения должны быть в *.h файле.
0
0 / 0 / 0
Регистрация: 15.05.2012
Сообщений: 200
03.12.2019, 06:39  [ТС] 3
Цитата Сообщение от _stanislav Посмотреть сообщение
шаблоны обычно не разделяют по разным файлам, и объявления и определения должны быть в *.h файле.
Спасибо, но это не решило проблему
0
"C with Classes"
1646 / 1403 / 523
Регистрация: 16.08.2014
Сообщений: 5,877
Записей в блоге: 1
03.12.2019, 06:43 4
Цитата Сообщение от EvilingDark Посмотреть сообщение
Спасибо, но это не решило проблему
наверное инициализатор по умолчанию нужно в объявление метода перенести
0
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,285
03.12.2019, 12:02 5
Цитата Сообщение от EvilingDark Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
    explicit My_vector(int s)
        : sz { s }
        , elem { new T[s] }
        , space { s }
    {
        for (int i = 0; i < sz; ++i)
            elem[i] = 0;
    }
C++
1
2
3
4
5
    explicit My_vector(int s)
        : sz { s }
        , elem { new T[s]() } // <----
        , space { s }
    {  }
Добавлено через 2 минуты
Цитата Сообщение от _stanislav Посмотреть сообщение
наверное инициализатор по умолчанию нужно в объявление метода перенести
Не наверное, а точно
Только не перенести, а убрать его из определения. Потому что в объявлении он у него уже написан.
0
03.12.2019, 12:02
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.12.2019, 12:02
Помогаю со студенческими работами здесь

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

шаблоны в си++
кто может сказать где прблема? List.h #ifndef LIST_H #define LIST_H #include&lt;iostream&gt;...

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

Шаблоны С++
Есть функция Merge из алгоритма сортировки слиянием, она объединяет два массива A и B, результат...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru