Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.68/40: Рейтинг темы: голосов - 40, средняя оценка - 4.68
 Аватар для IIRi3R@I{
0 / 0 / 0
Регистрация: 19.10.2009
Сообщений: 77

Класс для хранения массива данных

27.01.2015, 09:51. Показов 8639. Ответов 23
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Описать класс для хранения массива данных. Реализовать для него операцию индексации с контролем выходы индексов за пределы массива. В случае такого выхода генерировать исключение. Разработать текстовую программу на С++
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
27.01.2015, 09:51
Ответы с готовыми решениями:

Реализуйте класс для хранения ФИО и номера телефона человека, класс для хранения даты рождения человека, а также класс для хранения ФИО и почтового ад
Реализуйте класс для хранения ФИО и номера телефона человека, класс для хранения даты рождения человека, а также класс для хранения ФИО и...

Создайте класс для хранения данных о студенте
1. Создайте класс для хранения данных о студенте: фамилия, специальность, курс, успеваемость (массив из пяти элементов). В классе должны...

Создать класс-шаблон, содержащий поля для хранения одномерного массива
Создать класс-шаблон, содержащий поля для хранения одномерного массива и количества элементов в массиве. Описать методы для инициализации и...

23
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
28.01.2015, 14:15
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Croessmah Посмотреть сообщение
17.6.4.3.2 Global names [global.names]
Последнее упоминание об этом в документе:

Document Number: N3337
Date: 2012-01-16
Revises: N3291
Reply to: Stefanus Du Toit
Intel Corporation
cxxeditor@gmail.com
Обратите внимание на последний пункт:

17.6.4.3.2 Global names [global.names]
1 Certain sets of names and function signatures are always reserved to the implementation:
— Each name that contains a double underscore _ _ or begins with an underscore followed by an uppercase
letter (2.12) is reserved to the implementation for any use.
— Each name that begins with an underscore is reserved to the implementation for use as a name in the
global namespace.

В более позднем документе:

Document Number: N4296
Date: 2014-11-19
Revises: N4140
Reply to: Richard Smith
Google Inc
cxxeditor@gmail.com

Под этим пунктом сразу следующая секция начинается:
17.6.4.3.2 External linkage

Так то вообще, не нужно лазить в стандарт что бы понимать: раз на практике существуют служебные имена, которые начинаются с подчеркивания, значит клиентскому коду лучше не следовать этой нотации, вот и все.
0
 Аватар для DiffEreD
1458 / 795 / 257
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
28.01.2015, 14:34
Извиняюсь за оффтоп. Я тут немножко подправил вышеприведенный код и хотел бы услышать мнение экспертов. Будет ли данный код предоставлять строгую гарантию безопасности исключений?
Кликните здесь для просмотра всего текста
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
#include <algorithm>
#include <cassert>
#include <memory>
#include <stdexcept>
 
template <typename T>
class my_array {
 
   std::unique_ptr<T[]> array_;
   std::size_t size_ = 0;
 
   void assign(const T* const array) noexcept
   {
      std::copy(array, array + size_, array_.get());
   }
 
public:
   my_array() = default;
 
   my_array(const T* const array, std::size_t size) : array_(new T[size]), size_(size)
   {
      assign(array);
   }
 
   my_array(const my_array &rhs) : array_(new T[rhs.size_]), size_(rhs.size_)
   {
      assign(rhs.array_.get());
   }
 
   my_array(my_array &&rhs) noexcept :
      array_(std::move(rhs.array_)), size_(rhs.size_)
   {
      rhs.size_ = 0;
   }
 
   my_array & operator =(const my_array &rhs)
   {
      my_array tmp(rhs);
      swap(tmp);
      return *this;
   }
 
   my_array & operator =(my_array &&rhs) noexcept
   {
      array_ = std::move(rhs.array_);
      size_ = rhs.size_;
      rhs.size_ = 0;
      return *this;
   }
 
   T& operator [] (std::size_t idx)
   {
      if (idx >= size_) throw std::out_of_range("my_array");
      return array_[idx];
   }
 
   const T& operator [] (std::size_t idx) const
   {
      return const_cast<my_array&>(*this)[idx];
   }
 
   void swap(my_array &rhs) noexcept
   {
      std::swap(array_, rhs.array_);
      std::swap(size_, rhs.size_);
   }
 
   std::size_t size() const noexcept { return size_; }
 
};
 
int main()
{
   int array[] = {1,2,3};
   my_array<int> a{array, sizeof(array) / sizeof(*array)};
   my_array<int> a_copied(a);
   my_array<int> a_moved(std::move(a));
   assert(a.size() == 0);
   my_array<int> a_cassigned;
   a_cassigned = a_copied;
   assert(a_cassigned.size() == a_copied.size());
   my_array<int> a_massigned;
   a_massigned = std::move(a_copied);
   assert(a_copied.size() == 0 && a_moved.size() == 3);
   assert(a_massigned[2] == 3);
}
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
28.01.2015, 14:53
Цитата Сообщение от DiffEreD Посмотреть сообщение
Будет ли данный код предоставлять строгую гарантию безопасности исключений?
Будет

Добавлено через 9 минут
Правда смущает эта штука:

Если T кинет исключение при копировании, то благодаря noexcept, получим std::terminate

C++
1
2
3
4
void assign(const T* const array) noexcept
   {
      std::copy(array, array + size_, array_.get());
   }
1
 Аватар для DiffEreD
1458 / 795 / 257
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
28.01.2015, 15:28
Так к мы же указатели копируем - при этом не может произойти исключение.

Добавлено через 13 минут
Я походу фигню сморозил - будет кидать.
Тогда если так:
C++
1
2
3
4
5
6
void assign(const T* const array)
   {
      std::unique_ptr<T[]> tmp(new T[size_]);
      std::copy(array, array + size_, tmp.get());
      array_ = std::move(tmp);
   }
Добавлено через 17 минут
И плюс конструктора так:
C++
1
2
3
4
5
6
7
8
9
my_array(const T* const array, std::size_t size) : size_(size)
   {
      assign(array);
   }
 
   my_array(const my_array &rhs) : size_(rhs.size_)
   {
      assign(rhs.array_.get());
   }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
28.01.2015, 15:28
Помогаю со студенческими работами здесь

Создать класс, содержащий поля, которые можно использовать для хранения данных
Создать класс &lt;имя класса&gt; (имя класса задается в соответствии с выбранным вариантом), содержащий поля, которые можно использовать для...

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

Создать класс Mystring, предназначенный для хранения строки из символов типа char. Класс имеет метод для определения дли
Создать класс Mystring, предназначенный для хранения строки из символов типа char. Класс имеет метод для определения длины строки. Не...

Создать тип данных для хранения массива логических величин, перегрузить операторы поэлементно
Создать тип данных для хранения массива логических величин. Перегрузить операторы «&amp;&amp;», «||» и «!» для выполнения соответствующих...

Описать класс для хранения строк
Доброго всем времени суток. Помогите пожалуйста. получил задание: Описать класс для хранения строк, в котором могут присутствовать...


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

Или воспользуйтесь поиском по форуму:
24
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
Установка Emscripten SDK (emsdk) и CMake на Windows для сборки C и C++ приложений в WebAssembly (Wasm)
8Observer8 30.01.2026
Чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. Система контроля версиями Git. . .
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru