Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
7 / 6 / 1
Регистрация: 04.10.2021
Сообщений: 268

Работа с id объекта класса

22.10.2022, 17:07. Показов 782. Ответов 7
Метки c++, oop (Все метки)

Студворк — интернет-сервис помощи студентам
person.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
#ifndef REGISTRY_PERSON_H
#define REGISTRY_PERSON_H
 
#include <string>
 
using namespace std;
 
class Person {
 
protected:
 
    string name;
    string surname;
    int code;
 
public:
 
    void SetName(string name);
 
    void SetSurname(string surname);
 
    void SetCode(int code);
 
    string GetName();
 
    string GetSurname();
 
    int GetCode();
};
person.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
#include "../include/person.h"
 
void Person::SetName(string name) {
 
    this->name = name;
}
 
void Person::SetSurname(string surname) {
 
    this->surname = surname;
}
 
void Person::SetCode(int code) {
 
    this->code = code;
}
 
string Person::GetName() {
 
    return name;
}
 
string Person::GetSurname() {
 
    return surname;
}
 
int Person::GetCode() {
 
    return code;
}
 
#endif //REGISTRY_PERSON_H
patient.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
#ifndef REGISTRY_PATIENT_H
#define REGISTRY_PATIENT_H
 
#include "person.h"
 
class Patient : public Person {
 
private:
 
    string phone;
    int age;
    static int count;
 
public:
 
    Patient();
 
    void SetPhone(string phone);
 
    void SetAge(int age);
 
    string GetPhone();
 
    int GetAge();
   
};
 
 
#endif //REGISTRY_PATIENT_H
patient.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
#include "../include/patient.h"
#include <iostream>
 
int Patient::count = 0;
 
Patient::Patient() {
 
    count++;
    this->code = count - 1;
}
 
void Patient::SetPhone(string phone) {
 
    this->phone = phone;
}
 
void Patient::SetAge(int age) {
 
    this->age = age;
}
 
string Patient::GetPhone() {
 
    return phone;
}
 
int Patient::GetAge() {
 
    return age;
}
Метод класса который хранит в себе массив объектов Patient
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void Registry::RemovePatient(int patientToDelete) {
 
    int vectorLastIndex = patients.size() - 1;
 
    patients.erase(patients.begin() + patientToDelete);
    numberOfPatients--;
 
    if (patientToDelete != vectorLastIndex) {
 
        for (int i = patientToDelete; i < numberOfPatients; i++) {
 
            patients[i].SetCode(patients[i].GetCode() - 1);
        }
    }
}
Всем привет! Такая проблема: при создании объектов класса Patient я с помощью static поля класса генерирую для объектов code. Но насколько я знаю не желательно иметь сеттеры для поля code.

Но также у меня есть метод для удаления пациентов, после удаления пациента из массива хочу смещать code других пациентов на -1, но как я могу это сделать без сеттеров для code? Помогите пожалуйста!

code - он же id
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
22.10.2022, 17:07
Ответы с готовыми решениями:

Проверка создания объекта класса BBB из класса AAA и работа с ним
#define @param2; // объявили для выяснения случая: нужен новый или использовать существующий. Class AAA { private: void...

Работа метода класса в зависимости от типа объекта класса
есть такой код: template &lt;typename __Type, size_t __m&gt; class mvector { private: __Type _m; ...

Описать в программе три объекта класса point и два объекта класса cpoint
#include &lt;iostream&gt; #include &lt;cmath&gt; #include &quot;point.h&quot; #include &quot;cpoint.h&quot; using namespace std; int main() { point...

7
 Аватар для lemegeton
4903 / 2696 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
22.10.2022, 17:24
Лучший ответ Сообщение было отмечено vadyansky как решение

Решение

Цитата Сообщение от vadyansky Посмотреть сообщение
после удаления пациента из массива хочу смещать code других пациентов на -1, но как я могу это сделать без сеттеров для code?
С чисто архитектурной точки зрения -- не надо этого делать.
Объект, который неявно изменяется из-за побочных эффектов будет приводить к неисчислимым и трудноуловимым багам.
Например, вы можете "потерять" такой объект в хэш таблице.

Если вы всё же очень хотите выстрелить себе в голову, можете так же статически хранить массив этих объектов и пересчитывайте айдишники при вызове деструктора.

Добавлено через 3 минуты
В 64 битного целом числе максимальное значение 18446744073709551616.

Даже если вы будете "терять" миллиард объектов в секунду, у вас уйдет 584 года, чтоб израсходовать весь диапазон значений.
И почти шесть лет при потере ста миллиардов объектов в секунду.
1
7 / 6 / 1
Регистрация: 04.10.2021
Сообщений: 268
22.10.2022, 17:24  [ТС]
Цитата Сообщение от lemegeton Посмотреть сообщение
С чисто архитектурной точки зрения -- не надо этого делать.
блин, а этож будет не красиво если в массиве типо сначала идет пациент например с id 0, а потом сразу 2
0
 Аватар для lemegeton
4903 / 2696 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
22.10.2022, 17:28
Лучший ответ Сообщение было отмечено vadyansky как решение

Решение

Вобщем, жалкий десяток миллиардов человек на планете вы сможете перезаписать 184 миллиона раз.

Добавлено через 28 секунд
Цитата Сообщение от vadyansky Посмотреть сообщение
блин, а этож будет не красиво если в массиве типо сначала идет пациент например с id 0, а потом сразу 2
В любой "боевой" базе так и происходит.

Добавлено через 37 секунд
А вообще, если посмотрите на современные асинхронные высоконагруженные решения, там будет что-то типа UUID-ов.
Которые вообще не подряд. )
1
7 / 6 / 1
Регистрация: 04.10.2021
Сообщений: 268
22.10.2022, 17:31  [ТС]
lemegeton, я просто задумывал что у меня id будет как бы отображать его индекс в массиве, и пользователь сможет писать id объекта и так удалять объект из массива, так как и id и индекс в массиве у объекта будет одинаковый. А теперь мне надо будет делать типо поиск объекта с таким id в массиве?
0
 Аватар для lemegeton
4903 / 2696 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
22.10.2022, 17:35
Лучший ответ Сообщение было отмечено vadyansky как решение

Решение

Отличный вопрос.
Да. Либо искать, либо... барабанная дробь... использование специальных структур данных!
Есть структуры данных, которые позволяют находить объекты за логорифмическое или даже за константное время.

Обычно они выполняются в виде "ассоциативных массивов" и реализуются в виде деревьев (логарифмическое время поиска, отсортированные результаты) или в виде хэш-таблиц (в лучшем случае константное, в худшем -- линейное время поиска, не отсортированные результаты).

Добавлено через 46 секунд
В стандартной библиотеке шаблонов С++ (stl) эти типы называются std::map и std::unordered_map и находятся в заголовке map.
1
7 / 6 / 1
Регистрация: 04.10.2021
Сообщений: 268
22.10.2022, 17:36  [ТС]
lemegeton, Спасибо!
0
 Аватар для lemegeton
4903 / 2696 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
22.10.2022, 17:37
В общем-то, если посмотреть, базы данных вроде постгреса или мускула делают примерно так.
Они хранят сами записи в виде таблицы, а дополнительно хранят некие "индексы", которые указывают на нужные записи в этих таблицах.
И если присмотреться, о чудо, самые популярные типы индексов как раз бинарное дерево и хэш-таблица. )))
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
22.10.2022, 17:37
Помогаю со студенческими работами здесь

Вызвать процедуру\функцию из другого объекта\класса. Из одного класса\объекта сделать два
Здравствуйте. Подскажите что не правильно делаю, и возможно ли вообще - вызвать процедуру\функцию из другого объекта\класса, в турбо...

Вызов методом объекта одного класса методов объекта другого класса
Привет! У меня есть два объекта: форма (FormServer) и класс с математическими функциями (TCoServer). Мне нужно вызвать в методе...

Работа с CDialog и изменение членов объекта другого класса
Есть главное диалоговое окно и его класс А, производный от класса CDialog, есть еще одно модальное диалоговое окно (его класс Б, тоже...

Создайте массив типа Employee и сохраните в него 3 объекта класса Employee и 3 объекта класса Manager
Здравствуйте! Задача: Создайте массив типа Employee и сохраните в него 3 объекта класса Employee и 3 объекта класса Manager, используя...

Передача объекта из одного экземпляра класса в другой с запретом обращаться к методам и свойствам этого объекта
Всем привет! Есть класс, в котором используется объект (MyObject, объявленный в private). При создании второго экземпляра этого класса...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru