Аватар для IIRi3R@I{
0 / 0 / 0
Регистрация: 19.10.2009
Сообщений: 77

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

27.01.2015, 09:51. Показов 8784. Ответов 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
Ответ Создать тему
Опции темы

Новые блоги и статьи
[golang] Двоичная куча, min-heap
alhaos 20.05.2026
Двоичная куча Двоичная куча — структура данных, которая всегда держит самый важный элемент наготове. Представьте очередь к хилеру в игре, и очередь из игроков в приоритете те у кого меньше. . .
[golang] Breadth-First Search
alhaos 19.05.2026
BFS (Breadth-First Search) — это базовый алгоритм обхода графа в ширину, который поуровнево исследует все связанные вершины. Он начинает с выбранной точки и проверяет всех соседей, прежде чем. . .
[golang] Алгоритм «Хак Госпера»
alhaos 17.05.2026
Алгоритм «Хак Госпера» Хак Госпера (Gosper's Hack) — алгоритм нахождения следующего по величине числа с тем же количеством установленных бит. Придуман Биллом Госпером в 1970-х, опубликован в. . .
Рисование бинарного древа до 6-го колена на js, svg.
russiannick 17.05.2026
<svg width="335" height="240" viewBox="0 0 335 240" fill="#e5e1bb"> <style> <!]> </ style> <g id="bush"> </ g> </ svg> function fn(){ let rost;/ / высота древа let xx=165,yy=210,w=256;
FSharp: interface of module
DevAlt 16.05.2026
Интерфейс модуля F# позволяет управлять доступностью членов, содержащихся в реализации модуля. По-умолчанию все члены модуля доступны: module Foo let x = 10 let boo () = printfn "boo" . . .
Хитросплетение родственных связей пантеона греческих богов.
russiannick 14.05.2026
Однооконник, позволяющий узреть и изучить отдельных героев древней Греции. <!DOCTYPE html> <html lang="ru"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible". . .
[golang] Угол между стрелками часов
alhaos 12.05.2026
По заданным значениям часа и минуты необходимо определить значение меньшего угла между стрелками аналогового циферблата часов. import "math" func angleClock(hour int, minutes int) float64 { . . .
Debian 13: Установка Lazarus QT5
ВитГо 09.05.2026
Эта инструкция моя компиляция инструкций volvo https:/ / www. cyberforum. ru/ blogs/ 203668/ 10753. html и его же старой инструкции по установке Lazarus с gtk2. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru