Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.89/18: Рейтинг темы: голосов - 18, средняя оценка - 4.89
1 / 1 / 0
Регистрация: 18.11.2017
Сообщений: 102

Транзакции и умные указатели

19.02.2021, 18:21. Показов 3957. Ответов 22
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть программа:
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
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
#include <locale.h>
#include <iostream>
using namespace std;
 
// класс, над объектами которого выполняются транзакции
template <class T2>
class Balance
{
T2 quantity;
public:
    Balance() : quantity(0) {}
    void set(int quantity) { this->quantity= quantity; } // инициализация объекта
        T2 get() { return quantity; } // возвращается значение объекта
};
 
// класс пополнения и снятия со счёта
template <class T2>
class Manage_balance
{
    T2* currentState; // текущее значение объекта класса
    T2* prevState; // предыдущее значение объекта класса
public:
    
    Manage_balance (): prevState(NULL), currentState(new T2) {}
    Manage_balance(const Manage_balance& obj) : currentState(new T2(*(obj.currentState))), prevState(NULL) {}
    ~Manage_balance() { delete currentState; delete prevState; } // деструктор
    //перегрузка операции присваивания
    Manage_balance& operator=(const Manage_balance& obj)
    {
        if (this != &obj) // проверка на случай obj=obj
        {
            delete currentState; // удаление текущего значения объекта
            currentState = new T2(*(obj.currentState)); // создание и копирование
        }
        return *this;
    }
    //отображение состояний (предыдущего и текущего) объекта
    void show(int account)
    {
        cout << "состояния объекта ";
        if (!account) cout << "до начала транзакции " << endl;
        else cout << "после выполнения транзакции " << endl;
        if (prevState) cout << "prevState = " << prevState->get() << endl;
        // предыдущее состояние
        else cout << "prevState = NULL" << endl;
        cout << "currentState = " << currentState->get() << endl; // текущее состояние
    }
    //метод пополнения счёта
    int top_up(int quantity)
    {
        delete prevState; // удаление предыдущего значения
        prevState = currentState; // текущее становится предыдущим
        currentState = new T2(*prevState); // создание нового значения текущего состояния
        if (!currentState) return 0; // ошибка (необходимо отменить действие)
        currentState->set(currentState->get()+quantity); // изменение состояния объекта
        return 1; // успешное окончание транзакции
    }
    //метод снятия со счёта
    int withdraw(int quantity)
    {
        delete prevState; // удаление предыдущего значения
        prevState = currentState; // текущее становится предыдущим
        currentState = new T2(*prevState); // создание нового значения текущего состояния
        if (!currentState) return 0; // ошибка (необходимо отменить действие)
        currentState->set(currentState->get() - quantity); // изменение состояния объекта
        return 1; // успешное окончание транзакции
    }
    //метод подтверждения (коммита) транзакции
    void commit()
    {
        delete prevState; // удаление предыдущего значения
        prevState = NULL; // предыдущего состояния нет
    }
    //метод отката транзакции
    void delete_()
    {
        if (prevState != NULL) {
            delete currentState; // удаление текущего значения
            currentState = prevState; // предыдущее становится текущим
            prevState = NULL; // предыдущего состояния нет
        }
    }
    T2 get_cur() { return currentState; }
    T2 get_prev() { return prevState; }
    void set_cur(int currentState) { this->currentState = currentState; }
    void set_prev(int prevState) { this->prevState = prevState; }
    //перегрузка операции ->
    T2* operator->()
    {
        return currentState;
    }
};
 
 
// класс поддержки транзакций
template <class T2>
class Statistics
{
    
};
 
// класс поддержки транзакций
template <class T2>
class Treatment
{
    
};
 
 
int main()
{
    setlocale(LC_ALL, "Russian");
    Manage_balance<Balance<int>> firstTransaction;
    firstTransaction->set(100); // начальная инициализация объекта
    firstTransaction.show(0);
 
    cout << "НАЧАЛЬНАЯ ИНИЦИАЛИЗАЦИЯ ПРОШЛА УСПЕШНО" << endl<<endl;
    cout << "ПЕРВАЯ ТРАНЗАКЦИЯ НАЧАТА СО ЗНАЧЕНИЕМ 50" << endl;
 
    if (firstTransaction.top_up(50)) // начало транзакции (изменение объекта)
    {
        firstTransaction.show(1);
        firstTransaction.commit(); // закрепление транзакции
    }
 
    cout << "ПЕРВАЯ ТРАНЗАКЦИЯ ПРОШЛА УСПЕШНО" << endl<<endl;
    firstTransaction.delete_(); // отмена транзакции при ошибке
    cout << "ПЕРВАЯ ТРАНЗАКЦИЯ БЫЛА ОТМЕНЕНА" << endl;
    firstTransaction.show(0);
 
    Manage_balance<Balance<int>> secondTransaction;
 
    cout << endl<<"ВТОРАЯ ТРАНЗАКЦИЯ НАЧАТА CO ЗНАЧЕНИЕМ 30" << endl;
    if (secondTransaction.withdraw(30)) { // начало транзакции (изменение объекта)
        secondTransaction.show(1);
        secondTransaction.commit(); // закрепление транзакции
    }
 
    cout << "ВТОРАЯ ТРАНЗАКЦИЯ ПРОШЛА УСПЕШНО" << endl;
    /*
    firstTransaction.show(0);*/
    return 0;
}
Проблема в том, что после работы через firstTransaction со значениями pervState и currentState, при работе через secondTransaction , неизвестные те значения pervState и currentState, которые были с firstTransaction (они нулевые). Пробовал в классе Balance сделать static quantity, но тогда pervState->get() и currentState->get() дают одинаковые значения. Может кто сможет накинуть ещё классов?
И ещё в этом коде есть реализация собственных умных указателей, чтобы считать количество ссылок, указывающих на объект, как мне подобное сделать здесь, чтобы считать количество операций?
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
#include <iostream>
#include <locale.h>
using namespace std;
class Employee {// класс, количество объектов которого должно отслеживаться
int age;
string department;
string position;
public:
void setDepartment(string department){
this->department = department;
}
void showDepartment() { cout << "Сотрудник работает в подразделении:" << department << endl; }
void showPosition() { cout << "Сотрудник работает на должности:" <<
position << endl; }
};
template <class T>
struct Status {
T* ptr; // указатель на объект
int counter; // счетчик числа ссылок на объект
};
//Класс умного указателя. Цель умного указателя состоит в подсчете количества ссылок
//через множество умных указателей на один объект
template <class T>
class SmartPointer {
Status<T>* smartPtr;
public:
SmartPointer(T* ptr = 0);
SmartPointer(const SmartPointer&);
~SmartPointer();
SmartPointer& operator=(const SmartPointer&); //перегрузка оператора
=
T* operator->() const; // перегрузка оператора ->
void showCounter() { cout<<smartPtr->counter; }
};
//конструктор умного указателя
template <class T>
SmartPointer<T>::SmartPointer(T* ptr) {
if (!ptr) smartPtr = NULL; // указатель на объект пустой
else {
smartPtr = new Status<T>;
smartPtr->ptr = ptr; // инициализирует объект указателем
smartPtr->counter = 1; // счетчик «прикрепленных» объектов инициализируем единицей
}
}
//конструктор копирования умного указателя
template <class T>
SmartPointer<T>::SmartPointer(const SmartPointer& obj)
:smartPtr(obj.smartPtr) {
if (smartPtr) smartPtr->counter++; // только увеличение числа ссылок
}
//деструктор умного указателя
template <class T>
SmartPointer<T>::~SmartPointer() {
if (smartPtr) {
smartPtr->counter--; // уменьшается число ссылок на объект
if (smartPtr->counter <= 0) { // если число ссылок на объект
меньше либо равно нулю, то уничтожается объект
delete smartPtr->ptr;//ссылка на объект уничтожается
delete smartPtr;
}
}
}
template <class T>
T* SmartPointer<T>::operator->() const {
if (smartPtr) return smartPtr->ptr;
else return NULL;
}
template <class T>
SmartPointer<T>& SmartPointer<T>::operator=(const SmartPointer& obj) {
if (smartPtr) {
smartPtr->counter--; // уменьшаем счетчик «прикрепленных»
объектов
if (smartPtr->counter <= 0) { // если объектов нет, то выполняется освобождается выделенная память
delete smartPtr->ptr;
delete smartPtr;
}
}
smartPtr = obj.smartPtr; // присоединение к новому указателю
if (smartPtr) smartPtr->counter++; // увеличить счетчик «прикрепленных» объектов
return *this;
}
int main() {
setlocale(LC_ALL, "Russian");
SmartPointer<Employee> employeeIT(new Employee);
employeeIT->setDepartment("Отдел аналитики");
employeeIT->showDepartment();
SmartPointer<Employee> employeeAdmin(new Employee);
SmartPointer<Employee> employeeService = employeeIT;
employeeIT.showCounter();
employeeAdmin.showCounter();
employeeService.showCounter();
employeeAdmin = employeeIT;
employeeAdmin.showCounter();
return 0;
//когда область видимости закончится, объект будет удален
}

0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
19.02.2021, 18:21
Ответы с готовыми решениями:

Сырые указатели и Умные указатели
Здравствуйте. Потихоньку изучаю С++. Встал вопрос про использование указателей. Есть у меня такой код. class point { ...

Умные указатели
в пространстве имен pointer надо реализовать шаблонный класс unique - перегрузите операторы * и -&gt;. Реализация этих...

Умные указатели
#include &lt;fstream&gt; #include &lt;algorithm&gt; #include &lt;vector&gt; #include &lt;iostream&gt; #include &lt;memory&gt; using namespace std; ...

22
263 / 152 / 33
Регистрация: 29.06.2019
Сообщений: 1,547
21.02.2021, 14:54
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Особого смысла в этом нет
ну почему... по тз: "смарт-указатели для подсчёта количества разных видов."... видов объектов, так полагаю (от тех 5 классов, которые надо создать)... но ТСу виднее... поэтому не вступаю в тему... лишь выразила свои сомнения о том, что всё проще, чем он пытается... хоть и писанины будет немного, чтобы разделить на 5 классов
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
21.02.2021, 15:00
Цитата Сообщение от JeyCi Посмотреть сообщение
ну почему... по тз: "смарт-указатели для подсчёта количества разных видов."... видов объектов, так полагаю (от тех 5 классов, которые надо создать)...
Да вот в том и проблема, что смарт-указатели, они служат вообще не для "подсчёта видов". Подсчёт видов транзакций ещё как-то можно организовать, но как туда прикрутить хоть какое-то подобие указателей - хрен знает.
0
263 / 152 / 33
Регистрация: 29.06.2019
Сообщений: 1,547
21.02.2021, 15:06
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
вообще не для "подсчёта видов".
ссылок... на виды?.. (как в примере с Employee по отделам)...
да ему ж не нужны смарт-указатели (он сам так сказал), а свой класс так назвать надо... и Employeer'ов приложил примером... (там по отделам как бы видно, как new создаётся и copy'тся с подсчётом)
вобщем ему решать ... я бы посоветовала ему всё-так ознакомиться с заданием и с его примерами...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
21.02.2021, 15:06
Помогаю со студенческими работами здесь

Умные указатели
Привет. Что-то разобраться до конца не могу, тк умных указателей не так то мало оказывается. Мне интересно, если я выделяю память под...

Умные указатели
Пишу класс дерево поиска:template&lt;typename T, typename Compare&gt; class AvlTree { private: struct Node { T...

Умные указатели
Разбираюсь с умными указателями. Попытался переписать кусок кода используя shared_ptr. Было Btree::Btree() { m_root=nullptr; } ...

умные указатели
у меня например есть куча юнитов, у каждого из них есть указатель на игровой ресурс (допустим камень). Есть такая задумка: когда камень...

Умные указатели
Насколько я понял для того что бы предотвратить передачу права владения используют const. Код из примера: template &lt;class T&gt; ...


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

Или воспользуйтесь поиском по форуму:
23
Ответ Создать тему
Новые блоги и статьи
Рефакторинг программы уравнивания.
Massaraksh7 26.05.2026
Пример по предыдущей записи в блоге. Но, надо заметить, что, во-первых, там оптимизация не только математики, но и работы с базой данных, и с графами, а во-вторых, это ещё не всё.
Использование TThread в Lazarus для математических вычислений.
Massaraksh7 25.05.2026
Производя рефакторинг своих программ на предмет ускорения их работы, обратил внимание на такой аспект, как сокращение времени матвычислений. Дело в том, что приходится работать с большими матрицами. . .
Модель здравосохранения 18. Чем здоровее работник, тем быстрее выгорает
anaschu 24.05.2026
Имитационная модель корпоративного здравоохранения: что показывает математика Сегодня в модели рабочего коллектива на AnyLogic появились три новые механики — выгорание через накопленную усталость,. . .
Модель здравосохранения 17. Планы на выгорание
anaschu 23.05.2026
Вот конкретная схема реализации: В классе Работник добавить: накопленнаяУсталость — растёт каждый час работы, снижается в перерывы и болезни коэффициентПрезентеизма — снижает продуктивность. . .
Изменение цветов в палитре gif файла aka фавикона
russiannick 23.05.2026
Изменение цветов в палитре gif файла, юзаемого как фавиконка в составе html-файла, помещенная в base64, средствами нативного Java Script, навеянное сном в майский день. Для работы необходим браузер,. . .
Модель здравосохранения 16. Слишком хорошие и здоровые сотрудники уходят, недовольные зарплатой
anaschu 23.05.2026
Отладка увольнений и настройка производительности Сегодня во второй половине дня разобрались с механикой увольнений и настроили коэффициент сложности заданий. Вот что было сделано. . . .
Как я стал коммунистом))) Модель сохранения здоровья сотрудников, запись блога номер 15
anaschu 23.05.2026
Внезапно хорошее здоровье сотрудников не нужно капиталистам?))
Модель здравоСохранения 15. Как мы чинили AnyLogic модель рабочего коллектива: сочленение диаграммы состояний болезней и поломок в ресурспул
anaschu 23.05.2026
Как мы чинили AnyLogic модель рабочего коллектива Сегодня разобрались с пятью багами, из-за которых модель либо падала с ошибкой, либо давала совершенно бессмысленные результаты. Каждый баг был. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru