Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
cHuVbaka
0 / 0 / 0
Регистрация: 09.11.2013
Сообщений: 122
#1

Исправить код конструктора и деструктора - C++

14.05.2014, 19:04. Просмотров 241. Ответов 10
Метки нет (Все метки)

Что-то не так с конструктором, так нельзя обнулять?
нужно найти ошибку в деструкторе...
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
#include <iostream>
using namespace std;
 
class Book
{
    char* _surname; // фамилия автора
char* _name; // имя автора
char* _patronymic; // отчество автора
int _year; // год издательства
char* _book; // название книги
int _count; // количество страниц
public:
 
    Book(char* surname, char* name, char* patronymic)
        :_count(0), _year(0), _surname(NULL), _name(NULL), _patronymic(NULL), _book(NULL)
    {
        SetSurname(surname);
SetName(name);
SetPatronymic(patronymic);
cout <<"Вызов конструктора!!!"<<endl;
    }
 
    ~Book(void)
    {
        if(_surname != NULL)
            delete[] _surname;
 
        if(_name != NULL)
            delete[] _name;
 
        if(_patronymic != NULL)
            delete[] _patronymic;
 
        if(_book != NULL)
            delete[] _book;
        cout <<"Вызов деструктора!!!"<<endl;
    }
 
    void SetSurname(char* surname) 
    {
        cout <<"Метод SetSurname - ";
 
        if(_surname != NULL) 
        {
            cout <<"Старая запись: " << _surname << " ";
 
            delete[] _surname; 
        }
 
        _surname = _strdup(surname); // выдиляем и копируем новое значение
 
        cout <<"Новая запись: " << _surname<<endl;
    }
 
    void SetName(char* name)
    {
        cout <<"Метод SetName - ";
 
        if(_name != NULL)
        {
            cout <<"Старая запись: " << _name << " ";
 
            delete[] _name;
        }
 
        _name = _strdup(name);
 
        cout <<"Новая запись: " << _name<<endl;
    }
    void SetPatronymic(char* patronymic)
    {
        cout <<"Метод SetPatronymic - ";
 
        if(_patronymic != NULL)
        {
            cout <<"Старая запись: " << _patronymic << " ";
 
            delete[] _patronymic;
        }
 
        _patronymic = _strdup(patronymic);
 
        cout <<"Новая запись: " << _patronymic<<endl;
    }
 
    void SetBook(char* book)
    {
        cout <<"Метод SetBook - ";
 
        if(_book != NULL)
        {
            cout <<"Старая запись: " << _book << " ";
 
            delete[] _book;
        }
 
        _book = _strdup(book);
 
        cout <<"Новая запись: " << _book;
    }
 
    void SetYear(int year)
    {
        _year = year;
    }
 
    void SetCount(int count)
    {
        _count = count;
    }
 
    const char* GetSurname()const
    {
        return _surname;
    }
 
    const char* GetName()const
    {
        return _name;
    }
 
    const char* GetPatronymic()const
    {
        return _patronymic;
    }
 
    const char* GetPost()const
    {
        return _book;
    }
 
    const int GetYear()const
    {
        return _year;
    }
 
    const int GetCount()const
    {
        return _count;
    }
};
 
int main()
{
    setlocale(LC_ALL, "RUS"); // рус язык
Book* book = new Book("Syrname", "Name", "Patronymic");
book->SetYear(1980);
book->SetCount(3000);
cout << book->GetSurname() << " " << book->GetName() <<endl;
delete book;
    system("PAUSE");
    return 0;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Nick Alte
Эксперт С++
1599 / 991 / 117
Регистрация: 27.09.2009
Сообщений: 1,911
Завершенные тесты: 1
14.05.2014, 19:35     Исправить код конструктора и деструктора #2
Функция strdup создаёт копию строки, но память выделяет не через new[]. Соответственно, и удаление её через delete[] некорректно.
cHuVbaka
0 / 0 / 0
Регистрация: 09.11.2013
Сообщений: 122
15.05.2014, 03:16  [ТС]     Исправить код конструктора и деструктора #3
ну так просто без delete[] ?

ребят, а с конструктором что, что делать с нулями в параметрах, что бы норм работало?
alsav22
5411 / 4807 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
15.05.2014, 06:48     Исправить код конструктора и деструктора #4
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
#include <iostream>
using namespace std;
 
class Book
{
    char* _surname; // фамилия автора
    char* _name; // имя автора
    char* _patronymic; // отчество автора
    int _year; // год издательства
    char* _book; // название книги
    int _count; // количество страниц
    public:
 
    Book(char* surname, char* name, char* patronymic)
        :_count(0), _year(0), _book(NULL)
    {
         _surname = _strdup(surname);
         _name = _strdup(name);
         _patronymic = _strdup(patronymic);
         cout <<"Вызов конструктора!!!"<<endl;
    }
 
    ~Book(void)
    {
        free(_surname);
        free(_name);
        free(_patronymic);
        free(_book);
        cout <<"Вызов деструктора!!!"<<endl;
    }
 
    void SetSurname(char* surname) 
    {
        cout <<"Метод SetSurname - ";
 
        if(_surname != NULL) 
        {
            cout <<"Старая запись: " << _surname << " ";
 
            free(_surname); 
        }
 
        _surname = _strdup(surname); // выдиляем и копируем новое значение
 
        cout <<"Новая запись: " << _surname << endl;
    }
 
    void SetName(char* name)
    {
        cout <<"Метод SetName - ";
 
        if(_name != NULL)
        {
            cout <<"Старая запись: " << _name << " ";
 
            free(_name);
        }
 
        _name = _strdup(name);
 
        cout <<"Новая запись: " << _name<<endl;
    }
    void SetPatronymic(char* patronymic)
    {
        cout <<"Метод SetPatronymic - ";
 
        if(_patronymic != NULL)
        {
            cout <<"Старая запись: " << _patronymic << " ";
 
            free(_patronymic);
        }
 
        _patronymic = _strdup(patronymic);
 
        cout <<"Новая запись: " << _patronymic<<endl;
    }
 
    void SetBook(char* book)
    {
        cout <<"Метод SetBook - ";
 
        if(_book != NULL)
        {
            cout <<"Старая запись: " << _book << " ";
 
            free(_book);
        }
 
        _book = _strdup(book);
 
        cout <<"Новая запись: " << _book;
    }
 
    void SetYear(int year)
    {
        _year = year;
    }
 
    void SetCount(int count)
    {
        _count = count;
    }
 
    const char* GetSurname()const
    {
        return _surname;
    }
 
    const char* GetName()const
    {
        return _name;
    }
 
    const char* GetPatronymic()const
    {
        return _patronymic;
    }
 
    const char* GetPost()const
    {
        return _book;
    }
 
    const int GetYear()const
    {
        return _year;
    }
 
    const int GetCount()const
    {
        return _count;
    }
};
 
int main()
{
    setlocale(LC_ALL, "RUS"); // рус язык
    Book* book = new Book("Syrname", "Name", "Patronymic");
    book->SetYear(1980);
    book->SetCount(3000);
    cout << book->GetSurname() << " " << book->GetName() <<endl;
    delete book;
    system("PAUSE");
    return 0;
}
cHuVbaka
0 / 0 / 0
Регистрация: 09.11.2013
Сообщений: 122
15.05.2014, 07:20  [ТС]     Исправить код конструктора и деструктора #5
alsav22, сетеры не работают, не видно как меняется
alsav22
5411 / 4807 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
15.05.2014, 07:32     Исправить код конструктора и деструктора #6
Цитата Сообщение от cHuVbaka Посмотреть сообщение
сетеры не работают, не видно как меняется
Не работают или не видно? Какой, конкретно, сетер не работает? Где не видно?
cHuVbaka
0 / 0 / 0
Регистрация: 09.11.2013
Сообщений: 122
15.05.2014, 07:42  [ТС]     Исправить код конструктора и деструктора #7
не видно по cout Новая запись - старая
alsav22
5411 / 4807 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
15.05.2014, 07:50     Исправить код конструктора и деструктора #8
Цитата Сообщение от cHuVbaka Посмотреть сообщение
не видно по cout
При использовании каких сетеров? В какой строке кода используются сетеры?
cHuVbaka
0 / 0 / 0
Регистрация: 09.11.2013
Сообщений: 122
15.05.2014, 09:02  [ТС]     Исправить код конструктора и деструктора #9
до - после
Миниатюры
Исправить код конструктора и деструктора  
alsav22
5411 / 4807 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
15.05.2014, 09:10     Исправить код конструктора и деструктора #10
Цитата Сообщение от cHuVbaka Посмотреть сообщение
до - после
И что с этого? Конструктор другой. Код, вообще, смотрите, или как? От темы отписался.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.05.2014, 19:47     Исправить код конструктора и деструктора
Еще ссылки по теме:

C++ Переписать код с использованием конструктора
C++ Вызов конструктора и деструктора с использованием пула
Классы. Программирование линейных алгоритмов с использованием конструктора, деструктора, C++
Необходимо преобразовать код в более простой - без функций, процедур и конструктора. C++
Исправить ошибку "no matching function for call" при использовании конструктора C++

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

Или воспользуйтесь поиском по форуму:
cHuVbaka
0 / 0 / 0
Регистрация: 09.11.2013
Сообщений: 122
18.05.2014, 19:47  [ТС]     Исправить код конструктора и деструктора #11
как сделать, что бы было видно как оно изменилось ( как на первом скрине)...
Yandex
Объявления
18.05.2014, 19:47     Исправить код конструктора и деструктора
Ответ Создать тему
Опции темы

Текущее время: 23:58. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru