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

Использование умного указателя std::weak_ptr

15.12.2018, 19:05. Показов 889. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть вот такой код иерархии классов. Нужно в последнем классе list, вместо динамического массива compos *arr, реализовать динамический массив с помощью умного указателя std::weak_ptr. Прочитал много статей про этот указатель и, всё равно, не в зуб ногой. Помогите реализовать, пожалуйста.



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
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <iomanip>
#include <conio.h>
#include <fstream>
#include <string>
#include <ctime>
#include <memory>
 
using namespace std;
 
class date
{
protected:
    int day, month, year;
public:
    date()
    {
        day = 27;
        month = 1; 
        year = 1756;
    }
    date(int d, int m, int y)
    {
        if (d < 1 || d > 31)
            day = 27;
        else
            day = d;
        if (m < 1 || m > 12)
            month = 1;
        else
            month = m;
        if (y < 1500 || y > 2018)
            year = 1756;
        else
            year = y;
    }
    date(const date &dateObj)
    {
        *this = dateObj;
    }
    void show();
    void fshow();
};
 
class musCompos
{
protected:
    int symphony, sonata;
    char* concert;
    char* divertissement;
public:
    musCompos()
    {
        symphony = 39;
        sonata = 16;
        concert = new char[6];
        strcpy(concert, "Piano");
        divertissement = new char[8];
        strcpy(divertissement, "D major");
    }
    musCompos(int sym, int son, char* con, char* div)
    {
        symphony = sym;
        sonata = son;
        concert = new char[strlen(con) + 1];
        divertissement = new char[strlen(div) + 1];
        strcpy(concert, con);
        strcpy(divertissement, div);
    }
    musCompos(const musCompos &musObj)
    {
        *this = musObj;
    }
    void show();
    void fshow();
};
 
class person : public date
{
protected:
    char* surname;
public:
    char* name;
    //string name;
    person()
    {
        name = new char[17];
        strcpy(name, "Wolfgang Amadeus");
        //name = "Wolfgang Amadeus";
        surname = new char[7];
        strcpy(surname, "Mozart");
        date();
    }
    person(/*string nm,*/ char* nm, char* snm, int d, int m, int y) : date(d, m, y)
    {
        name = new char[strlen(nm) + 1];
        strcpy(name, nm);
        //name = nm;
        surname = new char[strlen(snm) + 1];
        strcpy(surname, snm);
        
    }
    person(const person &personObj)
    {
        *this = personObj;
    }
    void show();
    void fshow();
};
 
class compos : public person, public musCompos, public date
{
protected:
    char* description;
public:
    int minutes, seconds;
    compos()
    {
        description = new char[15];
        strcpy(description, "calm, relaxing");
        minutes = 3;
        seconds = 23;
        person();
        musCompos();
        date();
    }
    compos(char* des, int min, int sec, int d, int m, int y, person composytor, musCompos msc) : person(composytor), musCompos(msc), date(d, m, y)
    {
        description = new char[strlen(des) + 1];
        strcpy(description, des);
        minutes = min;
        seconds = sec;
    }
    compos(const compos &composObj) 
    { 
        *this = composObj; 
    };
    void getTime();
    void fgetTime();
    void show();
    void fshow();
};
 
class list : public compos
{
public:
    unsigned int len;
    compos *arr;
 
    list()
    {
        len = 5;                                        //65535;
        arr = new compos[len];
        person bet("Ludwig van", "Beethoven", 16, 12, 1770), bac("Johann Sebastian", "Bach", 21, 3, 1685), viv("Antonio", "Vivaldi", 4, 3, 1678), cha("Pyotr", "Chaikovsky", 7, 5, 1840);
        musCompos betc(9, 14, "Piano", "C major"), bacc(3, 8, "Organ", "B minor"), vivc(16, 3, "Violin", "F major"), chac(1, 3, "Piano", "D minor");
        arr[0] = compos();
        arr[1] = compos("exciting, anxious", 3, 135, 1, 1, 1801, bet, betc);
        arr[2] = compos("incredible, space", 47, 3, 24, 10, 1720, bac, bacc);
        arr[3] = compos("energetic, lively", 25, 64, 9, 5, 1700, viv, vivc);
        arr[4] = compos("interesting, intriguing", 60, 38, 5, 1, 1880, cha, chac);
    }
    list(int ln, compos cmp) : compos(cmp)
    {
        len = ln;
        arr = new compos[len];
    }
    ~list()
    {
        delete[]arr;
    }
    compos &operator[](int i)
    {
        if (i < 0 || i > 4)
        {
            cout << " Wrong index (i = " << i << ")" << endl;
            cout << " Program completion..." << endl;
            _getch();
            exit(0);
        }
        else arr[i].show();
    }
    template <typename T>
    void average(T *arr)
    {
        int sum = 0;
        int sums = 0;
        int avrg = 0;
        int avrgs = 0;
        for (int i = 0; i < len; i++)
        {
            sum += arr[i].minutes;
        }
        for (int i = 0; i < len; i++)
        {
            sums += arr[i].seconds;
        }
        sum += sums / 60;
        avrg = sum / len;
        sums = sums % 60;
        avrgs = sums / len;
        cout << " Average time of compositions duration: ";
        if (avrgs > 9)
            cout << avrg << ":" << avrgs << endl;
        else 
            cout << avrg << ":0" << avrgs << endl;
    }
    void sortName();
    void sortTime();
    void show();
    void fshow();
    void bshow();
};
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
15.12.2018, 19:05
Ответы с готовыми решениями:

Реализация умного указателя
Добрый вечер. Сегодня с умным указателем поиграться. Написал обгортку : #pragma once template &lt;typename T&gt; class UniquePtr...

Доступ к полю умного указателя
Привет. Реализовал умный указатель. Появилась проблема: Если обращаться через перегруженный -&gt;(селектор) к объекту класса...

Проверить правильность реализации умного указателя
? template&lt;class T&gt; class Auto_Ptr { public: Auto_Ptr(); explicit Auto_Ptr(T* alloc); virtual ~Auto_Ptr(); ...

4
166 / 109 / 57
Регистрация: 30.08.2018
Сообщений: 357
16.12.2018, 00:31
Какие умные указатели ? Там же всё нужно переделывать.
Если даже этот код компилируется, попробуйте в main создать две персоны . Поменять имя первой персоне.
И о чудо, имя второй персоны тоже изменится
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
int main()
{
    person person1;
 
    person person2(person1);
 
    std::cout <<  "Person2 name before:  " << person2.name << std::endl;
    
    strcpy(person1.name, "Andriano");
 
    std::cout <<  "Person2 name after:  " << person2.name << std::endl;
 
}

Вы проделали много работы и это достойно уважения, но такой код нужно выбросить и написать новый.
Что за кощунство наследовать персону от даты ?
C++
1
class person : public date
0
2 / 2 / 0
Регистрация: 04.03.2017
Сообщений: 21
16.12.2018, 01:52  [ТС]
Почему никто не хочет вникнуть в вопрос и ответить на него... Часть кода, которую я скинул - лишь header file, с иерархией класса и несколькими функциями. Есть отдельный сшник с остальными функциями, и ещё один сшник с mainом. Вся программа работает отлично, и всё что я делал - прописано в задании к лабе. Так что всё кощунство, в том числе и наследование персоны от даты - задумка "заказчика", а я лишь исполнитель его больного воображения.)
0
166 / 109 / 57
Регистрация: 30.08.2018
Сообщений: 357
16.12.2018, 02:07
Цитата Сообщение от igork4 Посмотреть сообщение
я лишь исполнитель
Исполнителю нужно знать правила трех. А лучше -- правило пяти.
Деструкторов в классах не хватает.
Цитата Сообщение от igork4 Посмотреть сообщение
Почему никто не хочет вникнуть в вопрос и ответить на него...
Сначала код напишите по-человечески.
Это вас не смущает ? Открытые данные
Цитата Сообщение от igork4 Посмотреть сообщение
C++
1
public: char* name;

копиконструкторы, ужос какой-то
Цитата Сообщение от igork4 Посмотреть сообщение
C++
1
2
3
4
date(const date &dateObj)
    {
        *this = dateObj;
    }
Добавлено через 36 секунд
Цитата Сообщение от igork4 Посмотреть сообщение
Вся программа работает отлично
Она не работает
0
2 / 2 / 0
Регистрация: 04.03.2017
Сообщений: 21
16.12.2018, 11:32  [ТС]
Боже мой ,я же объясняю, что у меня ещё два сшника, и вместе с ними код работает без каких либо проблем. Если не можете помочь, огромная просьба, проходите, пожалуйста, мимо и не флудите в тему. Мне не нужна оценка моего кода вовсе, это сделает заказчик. Если вы топ кодер то почему же не работаете в microsoft или google, а вместо этого комментируете чужой "отвратительный" код...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
16.12.2018, 11:32
Помогаю со студенческими работами здесь

Не выводится сообшения от деструктора для умного указателя
#ifndef Shared_ptr_H #define Shared_ptr_H template&lt;class T&gt; class shared_ptr { private: struct storage { T*...

Утечка при комбинации сырого и умного указателя
После выхода из блока shared_ptr вызывает деструкторы объектов, но они почему-то остаются в unordered_set и последний for их успешно...

Передача умного указателя в функцию принимающую указатель на указатель
Итак имеется функция со следующим параметром: HRESULT __stdcall Function(SomeClass **param); В случае, когда создаём обычный...

Использование std::function в std::thread
Нужно вызвать function fnc в новом потоке. Как сделать? function &lt;void(vector&lt;char&gt;)&gt; fnc; void test(vector&lt;char&gt; data) { ...

Использование указателя this
Вообщем решил я задачу: файл 1: // stack.h -- class definition for the stack ADT #ifndef STACK_H_ #define STACK_H_ #include...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru