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

Класс динамического массива для различных типов - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 20, средняя оценка - 4.90
frostua
0 / 0 / 0
Регистрация: 07.11.2011
Сообщений: 27
24.11.2011, 16:49     Класс динамического массива для различных типов #1
Можно ли создать класс динамического массива, чтоб при создании массива можно было бы задать размер и тип массива. Например что-то типа такого

C++
1
2
3
4
5
6
class dinarray {...}
 
void main(){
 
dinarray A(size, char);
}
где size - размер массива, char - тип элементов массива
 Комментарий модератора 
Код выделяем тегами
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Сыроежка
Заблокирован
24.11.2011, 16:55     Класс динамического массива для различных типов #2
frostua,

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

Например,

C++
1
2
template <typename T, size_t N = 10>
class dinarray;
а в коде создаете объект этого класса

C++
1
dinarray<int> a;
]
frostua
0 / 0 / 0
Регистрация: 07.11.2011
Сообщений: 27
24.11.2011, 17:29  [ТС]     Класс динамического массива для различных типов #3
Цитата Сообщение от Сыроежка Посмотреть сообщение
frostua,

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

Например,

[CPP]template <typename T, size_t N = 10>
class dinarray;[/CPP

а в коде создаете объект этого класса

C++
1
dinarray<int> a;
]
не совсем понял что обозначает size_t N = 10
N - это размер по умолчанию, а size_t что?
Сыроежка
Заблокирован
24.11.2011, 17:34     Класс динамического массива для различных типов #4
Цитата Сообщение от frostua Посмотреть сообщение
не совсем понял что обозначает size_t N = 10
N - это размер по умолчанию, а size_t что?
size_t - это синоним типа unsigned int и определяется как

C++
1
typedef unsigned int size_t;
Размер по умолчанию - это 10.
frostua
0 / 0 / 0
Регистрация: 07.11.2011
Сообщений: 27
24.11.2011, 19:22  [ТС]     Класс динамического массива для различных типов #5
Цитата Сообщение от Сыроежка Посмотреть сообщение
size_t - это синоним типа unsigned int и определяется как

C++
1
typedef unsigned int size_t;
Размер по умолчанию - это 10.
Помоему лучше размер массива указывать в параметрах конструктора, т.к. для каждого набора параметров шаблона компилятор создаст отдельный экземпляр класса. И если мы по ходу программы часто создаем объекты разных размеров, то столько же будет и классов в коде, как вы считаете?
Bers
Заблокирован
24.11.2011, 19:27     Класс динамического массива для различных типов #6
Цитата Сообщение от frostua Посмотреть сообщение
Помоему лучше размер массива указывать в параметрах конструктора, т.к. для каждого набора параметров шаблона компилятор создаст отдельный экземпляр класса. И если мы по ходу программы часто создаем объекты разных размеров, то столько же будет и классов в коде, как вы считаете?
Очень правильное наблюдение. Но если так - вы должно быть и сами уже поняли, как сделать аналог вектора
Сыроежка
Заблокирован
24.11.2011, 19:34     Класс динамического массива для различных типов #7
Цитата Сообщение от frostua Посмотреть сообщение
Помоему лучше размер массива указывать в параметрах конструктора, т.к. для каждого набора параметров шаблона компилятор создаст отдельный экземпляр класса. И если мы по ходу программы часто создаем объекты разных размеров, то столько же будет и классов в коде, как вы считаете?
Если ваша реализация не включает объявление массива, то конечно можно обойтись без второго шаблонного параметра. А если ваша реализация включает массив, то уже никак без второго параметра не обойтись. Вы же не указали, как вы собираетесь реализовывать то, что задумали.
Bers
Заблокирован
24.11.2011, 19:37     Класс динамического массива для различных типов #8
Цитата Сообщение от Сыроежка Посмотреть сообщение
без второго шаблонного параметра.
Шаблонный параметр шаблона, и параметр шаблона - это две большие разницы. В вашем примере - параметр шаблона.
Сыроежка
Заблокирован
24.11.2011, 19:47     Класс динамического массива для различных типов #9
Цитата Сообщение от Bers Посмотреть сообщение
Шаблонный параметр шаблона, и параметр шаблона - это две большие разницы. В вашем примере - параметр шаблона.
\

Я вас умоляю, читайте стандарт и не учите ученого! Рано вам еще это делать!
lemegeton
 Аватар для lemegeton
2909 / 1338 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
24.11.2011, 19:49     Класс динамического массива для различных типов #10
Цитата Сообщение от Сыроежка Посмотреть сообщение
А если ваша реализация включает массив, то уже никак без второго параметра не обойтись.
Хм. Я не вижу проблем объявить начальный размер массива параметром конструктора.
Например.
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
#include <iostream>
 
template <class T>
class Vector {
 public:
  typedef T ValueType;
  Vector() : capacity(0), begin(NULL), end(begin) {}
  explicit Vector(size_t capacity_)
    : capacity(capacity_), begin(new ValueType[capacity]),
    end(begin + capacity) {}
  ~Vector() { clear(); }
  ValueType &operator[](size_t n) { return begin[n]; }
  ValueType &operator[](size_t n) const { return begin[n]; }
  void resize(size_t newSize) {
    if (newSize > capacity)
      recap(newSize);
    end = begin + newSize;
  }
  void pushBack(const ValueType &value) {
    if (size() >= capacity)
      recap(capacity + 1);
    *end++ = value;
  }
  size_t size() const {
    return end - begin;
  }
  void clear() {
    delete [] begin;
    capacity = 0;
    begin = NULL;
  }
 private:
  void recap(size_t newCapacity) {
    ValueType *newBegin = new ValueType[newCapacity];
    size_t oldSize = size();
    size_t limit = ((newCapacity < capacity) ? newCapacity : capacity);
    for (size_t i = 0; i < limit; ++i)
      newBegin[i] = begin[i];
    delete [] begin;
    begin = newBegin;
    end = begin + oldSize;
    capacity = newCapacity;
  }
  size_t capacity;
  ValueType *begin;
  ValueType *end;
};
 
template <class T>
std::ostream &operator<<(std::ostream &stream,
  const Vector<T> &vector) {
  for (size_t i = 0; i < vector.size(); ++i)
    stream << vector[i] << " ";
  return stream;
}
 
int main(int argc, char *argv[]) {
  Vector<int> vector(5);
 
  for (size_t i = 0; i < vector.size(); ++i)
    vector[i] = i;
  std::cout << vector << std::endl;
  
  vector.resize(4);
  std::cout << vector << std::endl;
  
  vector.pushBack(5);
  vector.pushBack(6);
  std::cout << vector << std::endl;
}


Неужто имеется в виду классический "массив"?
frostua
0 / 0 / 0
Регистрация: 07.11.2011
Сообщений: 27
24.11.2011, 20:01  [ТС]     Класс динамического массива для различных типов #11
Цитата Сообщение от Сыроежка Посмотреть сообщение
Если ваша реализация не включает объявление массива, то конечно можно обойтись без второго шаблонного параметра. А если ваша реализация включает массив, то уже никак без второго параметра не обойтись. Вы же не указали, как вы собираетесь реализовывать то, что задумали.
Но второй параметр можно объявить и в параметрах конструктора, в том числе и по умолчанию, не вижу смысла его выносить в шаблон
Сыроежка
Заблокирован
24.11.2011, 20:10     Класс динамического массива для различных типов #12
Цитата Сообщение от frostua Посмотреть сообщение
Но второй параметр можно объявить и в параметрах конструктора, в том числе и по умолчанию, не вижу смысла его выносить в шаблон
Какя уже сказал, это при условии, что в реализации вашего класса не используется массив.

Чтобы было понятно, допустим вы хотите реализовать стек на основе массива. Как тогда задать размерность стека, чтобы был создан требуемой размерности массив?

C++
1
2
3
4
5
6
7
class Stack
{
public:
/*...*/
private:
   T array[N];
};
Как тогда такую конструкцию реаизовать? Я не вижу иных путей кроме использования двух параметров шаблона.
rangerx
1908 / 1517 / 139
Регистрация: 31.05.2009
Сообщений: 2,876
24.11.2011, 20:41     Класс динамического массива для различных типов #13
Если учесть, что ТС упомянул динамический массив в своём первом посте, думаю вариант с заданием размера массива через параметр шаблона отпадает сам собой

Добавлено через 28 минут
Цитата Сообщение от frostua Посмотреть сообщение
Но второй параметр можно объявить и в параметрах конструктора, в том числе и по умолчанию, не вижу смысла его выносить в шаблон
Если речь идёт о классе-обёртке над простым массивом, то единственный способ задать его размер это параметр шаблона, как это и сделано со стандартным контейнером std::array.
frostua
0 / 0 / 0
Регистрация: 07.11.2011
Сообщений: 27
24.11.2011, 21:04  [ТС]     Класс динамического массива для различных типов #14
всем спасибо за ответы
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.11.2011, 00:57     Класс динамического массива для различных типов
Еще ссылки по теме:

Написать класс для динамического массива с проверкой границ (что подразумевают под инициализацией?) C++
C++ написать класс динамического массива
Создать класс для реализации динамического массива C++

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

Или воспользуйтесь поиском по форуму:
frostua
0 / 0 / 0
Регистрация: 07.11.2011
Сообщений: 27
26.11.2011, 00:57  [ТС]     Класс динамического массива для различных типов #15
Цитата Сообщение от Сыроежка Посмотреть сообщение
Какя уже сказал, это при условии, что в реализации вашего класса не используется массив.

Чтобы было понятно, допустим вы хотите реализовать стек на основе массива. Как тогда задать размерность стека, чтобы был создан требуемой размерности массив?

C++
1
2
3
4
5
6
7
class Stack
{
public:
/*...*/
private:
   T array[N];
};
Как тогда такую конструкцию реаизовать? Я не вижу иных путей кроме использования двух параметров шаблона.
C++
1
2
3
4
5
6
7
8
class Stack
{
public:
/*...*/
private:
    enum  { N = 100 };
   T array[N];
};
Yandex
Объявления
26.11.2011, 00:57     Класс динамического массива для различных типов
Ответ Создать тему
Опции темы

Текущее время: 19:33. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru