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

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

15.12.2018, 19:05. Показов 568. Ответов 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.12.2018, 19:05
Ответы с готовыми решениями:

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

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

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

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

4
165 / 108 / 57
Регистрация: 30.08.2018
Сообщений: 357
16.12.2018, 00:31 2
Какие умные указатели ? Там же всё нужно переделывать.
Если даже этот код компилируется, попробуйте в 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  [ТС] 3
Почему никто не хочет вникнуть в вопрос и ответить на него... Часть кода, которую я скинул - лишь header file, с иерархией класса и несколькими функциями. Есть отдельный сшник с остальными функциями, и ещё один сшник с mainом. Вся программа работает отлично, и всё что я делал - прописано в задании к лабе. Так что всё кощунство, в том числе и наследование персоны от даты - задумка "заказчика", а я лишь исполнитель его больного воображения.)
0
165 / 108 / 57
Регистрация: 30.08.2018
Сообщений: 357
16.12.2018, 02:07 4
Цитата Сообщение от 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  [ТС] 5
Боже мой ,я же объясняю, что у меня ещё два сшника, и вместе с ними код работает без каких либо проблем. Если не можете помочь, огромная просьба, проходите, пожалуйста, мимо и не флудите в тему. Мне не нужна оценка моего кода вовсе, это сделает заказчик. Если вы топ кодер то почему же не работаете в microsoft или google, а вместо этого комментируете чужой "отвратительный" код...
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.12.2018, 11:32

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru