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

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

Войти
Регистрация
Восстановить пароль
 
Мимино
180 / 151 / 5
Регистрация: 22.05.2013
Сообщений: 435
Записей в блоге: 1
#1

Шаблоны. Нетиповые параметры - C++

17.07.2013, 22:18. Просмотров 1072. Ответов 11
Метки нет (Все метки)

Доброго времени суток. Столкнулся с проблемой. В учебнике, по которому я занимаюсь, о нетиповых параметрах написан всего 1 абзац , зато задачи присутствуют. Вот одна из них:
Написать шаблон класса Array с использованием нетипового параметра numberOfElements, который определяет количество элементов массива.
Ничего толком не зная о нетиповых параметрах я создал это (все постить не буду, ошибки пошли сразу же начиная с конструктора )
Класс:
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
template <class elementType, int numberOfElements>
class Array
{
    template <class elementType1, int numberOfElements1>
    friend ostream &operator <<(ostream &, const Array<elementType1, numberOfElements1> &);
    template <class elementType1, int numberOfElements1>
    friend istream &operator >>(istream &, Array<elementType1, numberOfElements1> &);
 
public:
    Array();
    Array(const Array<elementType, numberOfElements> &);
    ~Array();
    int getSize() const;
    const Array &operator = (const Array<elementType, numberOfElements> &);
    int operator == (const Array<elementType, numberOfElements> &) const;
    int operator != (const Array<elementType, numberOfElements> &) const;
    elementType &operator [](int);
 
 
private:
    elementType *ptr;
    int size;
};
#endif
Конструктор
C++
1
2
3
4
5
6
7
8
9
10
template <class elementType, int numberOfElements>
Array<elementType, numberOfElements>::Array()
{
    size = numberOfElements;
    ptr = new elementType[size];
    assert(ptr != 0);
 
    for (int i = 0; i < size; i++)
        ptr[i] = 0;
}
Ну и сразу же ожидаемая ошибка после объявления в мейне Array<int, 7> integers1;
1>Job 12 7.obj : error LNK2001: unresolved external symbol "public: __thiscall Array<int,7>::~Array<int,7>(void)" (??1?$Array@H$06@@QAE@XZ)
1>Job 12 7.obj : error LNK2001: unresolved external symbol "public: __thiscall Array<int,7>::Array<int,7>(void)" (??0?$Array@H$06@@QAE@XZ)
В гугле много инфы не нашел. Самое полезное
template <class T, int size>// реализация параметризованного члена-функции
void A<T, size>::func() {
}
то есть я вроде бы все правильно сделал.
Что мне нужно:
1. Статью, главу учебника, ссылку где я смогу прочитать и (тут самое главное) ПОНЯТЬ, как работать с нетиповыми параметрами
2. Простой пример(можно прямо на моем классе), который расставит все точки над i;
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.07.2013, 22:18
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Шаблоны. Нетиповые параметры (C++):

шаблоны и параметры - C++
// есть вот такой шаблон template &lt;typename T, int L&gt; struct qu{}; // компилируется вот это qu&lt;int, 13&gt; test1; // и вот это...

Шаблоны как параметры - C++
template&lt;typename T&gt; class beta { template&lt;class V&gt; class hold { V val; public: hold(V v = 0) : val(v) {} void...

Параметры-шаблоны у шаблонных классов - C++
Объясните плз, кто может, для чего используются параметры-шаблоны у шаблонных классов, и как они работают? :) Читаю Прату и застрял на...

Шаблоны как параметры шаблона - C++
Привет, в книге увидел такой пример template&lt;template&lt;typename T&gt; class x&gt; class y; но из объяснений в книге я совершенно...

Параметры функции через шаблоны - C++
Простейший пример из википеди не запускается, быть может я что-то не так делаю? template &lt; typename T &gt; T min( T a, T b ) { ...

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

11
Croessmah
Эксперт CЭксперт С++
13513 / 7671 / 866
Регистрация: 27.09.2012
Сообщений: 18,885
Записей в блоге: 3
Завершенные тесты: 1
17.07.2013, 22:26 #2
Реализацию деструктора напишите

Добавлено через 24 секунды
Цитата Сообщение от Мимино Посмотреть сообщение
Статью, главу учебника, ссылку где я смогу прочитать и (тут самое главное) ПОНЯТЬ, как работать с нетиповыми параметрами
Например, "C++ для профессионалов"
0
DU
1483 / 1129 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
17.07.2013, 22:29 #3
рекумендую такую книжку:
Шаблоны C++: справочник разработчика

picГод выпуска: 2003
Автор: Дэвид Вандевурд, Николай М. Джосаттис
Издательство: Вильямc
ISBN: 5-8459-0513-3
Формат: DjVu
Качество: Отсканированные страницы
Количество страниц: 544
http://rutracker.org/forum/viewtopic.php?t=758806

сабжевой теме посвящена глава 4.


C++
1
2
3
4
5
// все не смотрел. что видно сразу:
   ptr = new elementType[size];
// надо поменят на 
   ptr = new elementType[numberOfElements];
// size - не константа времени компиляции, в отличии от   numberOfElements
1
Мимино
180 / 151 / 5
Регистрация: 22.05.2013
Сообщений: 435
Записей в блоге: 1
17.07.2013, 22:32  [ТС] #4
Цитата Сообщение от Croessmah Посмотреть сообщение
Реализацию деструктора напишите
C++
1
2
3
4
5
template <class elementType, int numberOfElements>
Array<elementType, numberOfElements>::~Array()
{
    delete [] ptr;
}
0
Croessmah
Эксперт CЭксперт С++
13513 / 7671 / 866
Регистрация: 27.09.2012
Сообщений: 18,885
Записей в блоге: 3
Завершенные тесты: 1
17.07.2013, 22:34 #5
Мимино, я к тому, что нет реализации конструктора и деструктора:
1>Job 12 7.obj : error LNK2001: unresolved external symbol "public: __thiscall Array<int,7>::~Array<int,7>(void)" (??1?$Array@H$06@@QAE@XZ)
1>Job 12 7.obj : error LNK2001: unresolved external symbol "public: __thiscall Array<int,7>::Array<int,7>(void)" (??0?$Array@H$06@@QAE@XZ)
Цитата Сообщение от Мимино Посмотреть сообщение
C++
1
#endif
Вы случайно не разделили объявление и реализацию на разные файлы?
0
Мимино
180 / 151 / 5
Регистрация: 22.05.2013
Сообщений: 435
Записей в блоге: 1
17.07.2013, 22:35  [ТС] #6
Цитата Сообщение от Croessmah Посмотреть сообщение
Например, "C++ для профессионалов"
Мне б для новичков что то. 2 месяца только с++ учу.

Добавлено через 43 секунды
Цитата Сообщение от Croessmah Посмотреть сообщение
Вы случайно не разделили объявление и реализацию?
Да, конечно... то случайно затисалось. Во весь хидер
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
#ifndef ARRAY1_H
#define ARRAY1_H
#include <iostream>
using namespace std;
 
template <class elementType, int numberOfElements>
class Array
{
    template <class elementType1, int numberOfElements1>
    friend ostream &operator <<(ostream &, const Array<elementType1, numberOfElements1> &);
    template <class elementType1, int numberOfElements1>
    friend istream &operator >>(istream &, Array<elementType1, numberOfElements1> &);
 
public:
    Array();
    Array(const Array<elementType, numberOfElements> &);
    ~Array();
    int getSize() const;
    const Array &operator = (const Array<elementType, numberOfElements> &);
    int operator == (const Array<elementType, numberOfElements> &) const;
    int operator != (const Array<elementType, numberOfElements> &) const;
    elementType &operator [](int);
 
 
private:
    elementType *ptr;
    int size;
};
#endif
Добавлено через 42 секунды
А вот весь .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
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
#include "stdafx.h"
#include "array1.h"
#include <iostream>
#include <assert.h>
#include <stdlib.h>
using namespace std;
 
template <class elementType, int numberOfElements>
Array<elementType, numberOfElements>::Array()
{
    size = numberOfElements;
    ptr = new elementType[size];
    assert(ptr != 0);
 
    for (int i = 0; i < size; i++)
        ptr[i] = 0;
}
 
template <class elementType, int numberOfElements>
Array<elementType, numberOfElements>::Array(const Array<elementType, numberOfElements> &init)
{
    size = init.size;
    ptr = new elementType[size];
    assert(ptr != 0);
 
    for (int i = 0; i < size; i++)
        ptr[i] = init.ptr[i];
}
 
template <class elementType, int numberOfElements>
Array<elementType, numberOfElements>::~Array()
{
    delete [] ptr;
}
 
template <class elementType, int numberOfElements>
int Array<elementType, numberOfElements>::getSize() const
{
    return size;
}
 
template <class elementType, int numberOfElements>
const Array<elementType,numberOfElements> &Array<elementType, numberOfElements>::operator = (const Array<elementType, numberOfElements> &right)
{
    if (right != this)
    {
        delete [] ptr;
        size = right.size;
        ptr = new elementType[size];
        assert(ptr != 0);
 
        for (int i = 0; i < size; i++)
            ptr[i] = right.ptr[i];
    }
 
    return *this;
}
 
template <class elementType, int numberOfElements>
int Array<elementType, numberOfElements>::operator==(const Array<elementType, numberOfElements> &right) const
{
    if (size != right.size)
        return 0;
    for (int i = 0; i < size; i++)
        if (ptr[i] != right.ptr[i])
            return 0;
    return 1;
}
 
template <class elementType, int numberOfElements>
int Array<elementType, numberOfElements>::operator!=(const Array<elementType, numberOfElements> &right) const
{
    if (size != right.size)
        return 1;
    for (int i = 0; i < size; i++)
        if (ptr[i] != right.ptr[i])
            return 1;
    return 0;
}
 
template <class elementType, int numberOfElements>
elementType &Array<elementType, numberOfElements>::operator[](int subscript)
{
    assert(0 <= subscript && subscript < size);
 
    return ptr[subscript];
}
 
template <class elementType1, int numberOfElements1>
ostream &operator <<(ostream &output, const Array<elementType1, numberOfElements1> &a)
{
    int i;
    for (i = 0; i < a.size; i++)
    {
        output << a.ptr[i] << ' ';
        if ((i + 1) % 10 == 0)
            output << endl;
    }
 
    if (i % 10 != 0)
        output << endl;
 
    return output;
 
}
 
 
template <class elementType1, int numberOfElements1>
istream &operator >>(istream &input, const Array<elementType1, numberOfElements1> &a)
{
    for (int i = 0; i < a.size; i++)
        input >> a.ptr[i];
 
    return input;
 
}
0
Croessmah
Эксперт CЭксперт С++
13513 / 7671 / 866
Регистрация: 27.09.2012
Сообщений: 18,885
Записей в блоге: 3
Завершенные тесты: 1
17.07.2013, 22:37 #7
Цитата Сообщение от Мимино Посмотреть сообщение
Да, конечно...
Делайте всё в одном файле. Код шаблона должен быть доступен для инстанцирования.
Шаблон - это только описание того, как объект устроен, он не несет в себе другой информации.
1
Olivеr
412 / 408 / 13
Регистрация: 06.10.2011
Сообщений: 832
17.07.2013, 22:44 #8
А зачем выделять место в куче? Массив то фиксированный.
Достаточно сделать так:
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
#include <iostream>
#include <cstdint>
 
template <class T, uint64_t Size>
class array
{
    T arr[Size];
public:
    array() {}
    T& operator [] (uint64_t idx)
    { return arr[idx]; }
    T& operator [] (uint64_t idx) const;
    uint64_t size() const { return Size; }
    ~array() {}
};
 
template <class T, uint64_t Size>
T& array<T, Size>::operator [] (uint64_t idx) const
{ return arr[idx]; }
 
int main()
{
    array<int, 10> arr;
    for (int i = 0; i != arr.size(); ++i)
        arr[i] = i + 1;
    for (int i = 0; i != arr.size(); ++i)
        std::cout << arr[i];
    return 0;
}
0
Мимино
180 / 151 / 5
Регистрация: 22.05.2013
Сообщений: 435
Записей в блоге: 1
18.07.2013, 10:26  [ТС] #9
Цитата Сообщение от Croessmah Посмотреть сообщение
Делайте всё в одном файле. Код шаблона должен быть доступен для инстанцирования.
Шаблон - это только описание того, как объект устроен, он не несет в себе другой информации.
Блин, а я его 2 раза переписывал
Для удобства запихнул все в хидер. Спасибо большое.

Добавлено через 1 минуту
Цитата Сообщение от Olivеr Посмотреть сообщение
А зачем выделять место в куче? Массив то фиксированный.
Достаточно сделать так:
Да, я знаю. Шаблон писался с обычного класса, поэтому я старался менять по-минимуму, чтобы не запутаться.

Добавлено через 11 часов 36 минут
Осталась еще одна непонятная мне ситуация.
Все перегруженные операторы сравнения и присваивания, например
C++
1
2
3
4
5
6
7
8
9
10
template <class elementType, int numberOfElements>
int Array<elementType, numberOfElements>::operator==(const Array<elementType, numberOfElements> &right) const
{
    if (size != right.size)
        return 0;
    for (int i = 0; i < size; i++)
        if (ptr[i] != right.ptr[i])
            return 0;
    return 1;
}
работают только в случае одинаковых нетиповых праметров numberOfElements. Для каждого уникального параметра создается свой шаблонный класс или как?
0
OhMyGodSoLong
~ Эврика! ~
1244 / 993 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
18.07.2013, 10:35 #10
Цитата Сообщение от Мимино Посмотреть сообщение
Для каждого уникального параметра создается свой шаблонный класс или как?
Ага.
1
DU
1483 / 1129 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
18.07.2013, 10:38 #11
именно так. для компилятора классы, выведенные из шаблонов с разными аргументами - это разные классы. поэтому такие операторы нужно делать шаблонными. какие-то примеры есть в вышеприведенной книге в главе пять. там шаблонные операторы =.
1
Мимино
180 / 151 / 5
Регистрация: 22.05.2013
Сообщений: 435
Записей в блоге: 1
18.07.2013, 10:48  [ТС] #12
Понял, спасибо.
0
18.07.2013, 10:48
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.07.2013, 10:48
Привет! Вот еще темы с ответами:

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

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

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

Шаблоны - C++
При компиляции функция шаблона не выполняется template&lt;class T&gt; void sort_a(T a){ int min,n,m,k,i,j,t; min=0; ...


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

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

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