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

оператор = и конструктор копирования - C++

Восстановить пароль Регистрация
 
Hrollo
34 / 34 / 6
Регистрация: 05.11.2013
Сообщений: 147
01.03.2014, 18:13     оператор = и конструктор копирования #1
Всем привет. Дана задача: создать класс книга с полями автор,название,год выпуска книги. С помощью односвязного списка создать класс каталог который включает в себя класс книга. Предусмотреть ф -ции добавления в каталог, поиск по каталогу, удаление из каталога(все эти ф-ции получились). Для себя решил сделать конструктор копирования и операцию присваивания но они работают неправильно. Помогите разобраться с ними. Вот код:

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
#ifndef CATALOG_H
#define CATALOG_H
 
#include <iostream>
#include <string>
using std::string;
 
 
class Book
{
private:
    string autor;
    string title;
    int year;
public:
    Book(const string &a = "noname",const string &t = "noname",int y = 1900);
    string getAutor()const;
    string getTitle()const;
    int    getYear()const;
    void   setParametr(const string &a,const string &t,int y);
    void   setAutor(const string &a);
    void   setTitle(const string &t);
    void   setYear(int y);
    ~Book();
};
 
class Catalog
{
private:
    struct List
    {
        Book book;
        List *next;
    };
    List *head;
public:
    Catalog();
    Catalog &operator=(const Catalog &c);
   // Catalog(const Catalog &c);
    void add(const Book &b);
    void search(int y);
    void search(const string &s);
    void print()const;
    bool del(int y);
    bool del(const string &s);
    void FreeMemory();
    ~Catalog();
};
 
#endif // CATALOG_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
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
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
#include "catalog.h"
using std::cout;
using std::endl;
 
Book::Book(const string &a,const string &t,int y)
{
    autor = a;
    title = t;
    year = (y > 0) ? y : 1900;
}
Book::~Book()
{
 
}
string Book::getAutor()const
{
    return autor;
}
string Book::getTitle()const
{
    return title;
}
int Book::getYear()const
{
    return year;
}
 
void Book::setAutor(const string &a)
{
    autor = a;
}
void Book::setTitle(const string &t)
{
    title = t;
}
void Book::setYear(int y)
{
    year = y;
}
void Book::setParametr(const string &a,const string &t,int y)
{
    setAutor(a);
    setTitle(t);
    year = (y > 0) ? y : 1900;
}
 
//////////////////////////////////////////////////////////////////////////////////////
 
Catalog::Catalog()
{
    head = NULL;
}
Catalog &Catalog::operator=(const Catalog &c)
{
    List *p = head;
    List *p1 = c.head;
    bool res = true;
    if(p != NULL)
    {
        while(p)
        {
            if(p->book.getAutor() == p1->book.getAutor() && p->book.getTitle() == p1->book.getTitle() && p->book.getYear() == p1->book.getYear())
                    res = true;
            else
            {
                res = false;
                break;
            }
            p = p->next;
            p1 = p1->next;
        }
        if(res == true)
            return *this;
    }
    FreeMemory();
    List *temp = c.head;
    head = new List;
    head->book.setAutor(temp->book.getAutor());
    head->book.setTitle(temp->book.getTitle());
    head->book.setYear (temp->book.getYear());
    head->next = NULL;
    temp = temp->next;
    List *begin = head;
    List *t = new List;
    while(temp)
    {
        
        t->book.setAutor(temp->book.getAutor());
        t->book.setTitle(temp->book.getTitle());
        t->book.setYear(temp->book.getYear());
        t->next = NULL;
        begin->next = t;
        temp = temp->next;
    }
    return *this;
}
Catalog::Catalog(const Catalog &c)
{
    FreeMemory();
    List *temp = c.head;
    head = new List;
    head->book.setAutor(temp->book.getAutor());
    head->book.setTitle(temp->book.getTitle());
    head->book.setYear(temp->book.getYear());
    head->next = NULL;
    temp = temp->next;
    List *begin = head;
    while(temp)
    {
        List *p = new List;
        p->book.setAutor(temp->book.getAutor());
        p->book.setTitle(temp->book.getTitle());
        p->book.setYear(temp->book.getYear());
        p->next = NULL;
        begin->next = p;
        temp = temp->next;
    }
}
void Catalog::add(const Book &b)
{
    if(head == NULL)
    {
        head = new List;
        head->book.setAutor(b.getAutor());
        head->book.setTitle(b.getTitle());
        head->book.setYear(b.getYear());
        head->next = NULL;
        return;
    }
    List *t = head;
    List *p = new List;
    p->book.setAutor(b.getAutor());
    p->book.setTitle(b.getTitle());
    p->book.setYear(b.getYear());
    p->next = NULL;
    while(t)
    {
        if(t->next == NULL)
        {
            t->next = p;
            break;
        }
        t = t->next;
    }
}
void Catalog::search(int y)
{
    if(head == NULL)
    {
        cout<<"Catalog is empty!"<<endl;
        return;
    }
    int i(1);
    List *p = head;
    while(p)
    {
        if(p->book.getYear() == y)
        {
            cout<<"information "<<i<<" book:"<<endl;
            cout<<p->book.getAutor()<<", "<<p->book.getTitle()<<", "<<p->book.getYear()<<endl;
            i++;
        }
        p = p->next;
    }
    if(i == 1)
        cout<<"Catalog don't book created "<<y<<" year!"<<endl;
}
void Catalog::search(const string &s)
{
    if(head == NULL)
    {
        cout<<"Catalog is empty!"<<endl;
        return;
    }
    int i(1);
    List *p = head;
    while(p)
    {
        if(p->book.getTitle() == s || p->book.getAutor() == s)
        {
            cout<<"Information for "<<i<<" book:"<<endl;
            cout<<p->book.getAutor()<<", "<<p->book.getTitle()<<", "<<p->book.getYear()<<endl;
            i++;
        }
        p = p->next;
    }
    if(i == 1)
        cout<<"the directory does not contain such a book, or a book of this author!"<<endl;
}
void Catalog::print()const
{
    if(head == NULL)
    {
        cout<<"Catalog is empty!"<<endl;
        return;
    }
    int i(1);
    List *p = head;
    while(p)
    {
         cout<<"Information for "<<i<<" book:"<<endl;
         cout<<p->book.getAutor()<<", "<<p->book.getTitle()<<", "<<p->book.getYear()<<endl;
         p = p->next;
         i++;
    }
}
bool Catalog::del(int y)
{
    if(head == NULL)
    {
        cout<<"Catalog is empty!"<<endl;
        return false;
    }
    List *p = head;
    if(p->book.getYear() == y)
    {
        head = p->next;
        delete p;
        return true;
    }
    List *p1 = p->next;
    while(p1)
    {
        if(p1->book.getYear() == y)
        {
            p->next = p1->next;
            delete p1;
            return true;
        }
        p = p1;
        p1 = p1->next;
    }
    return false;
}
bool Catalog::del(const string &s)
{
    if(head == NULL)
    {
        cout<<"Catalog is empty!"<<endl;
        return false;
    }
    List *p = head;
    if(p->book.getAutor() == s || p->book.getTitle() == s)
    {
        head = p->next;
        delete p;
        return true;
    }
    List *p1 = p->next;
    while(p1)
    {
        if(p1->book.getAutor() == s || p1->book.getTitle() == s)
        {
            p->next = p1->next;
            delete p1;
            return true;
        }
        p = p1;
        p1 = p1->next;
    }
    return false;
}
void Catalog::FreeMemory()
{
    if(head == NULL)
        return;
    List *p = head;
    List *t = NULL;
    while(p)
    {
        t = p;
        p = p->next;
        delete t;
    }
    head = NULL;
}
Catalog::~Catalog()
{
    FreeMemory();
}
пример для теста класса

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
#include <iostream>
#include <string>
#include "catalog.h"
 
using namespace std;
 
void menu()
{
    cout<<"1.Add a book in the catalog."<<endl;
    cout<<"2.Delete all the books of the year."<<endl;
    cout<<"3.Delete all the books of the autor."<<endl;
    cout<<"4.Delete all the books of the title"<<endl;
    cout<<"5.Print catalog."<<endl;
    cout<<"6.Catalog search by year."<<endl;
    cout<<"7.Catalog search by autor."<<endl;
    cout<<"8.Catalog search by title."<<endl;
    cout<<"9.Clean screen."<<endl;
}
 
int main()
{
    Catalog list;
    string autor,title;
    int year;
    Book obj;
    int choice;
    bool t = true;
    menu();
    cout<<endl;
    do
    {
        cout<<"Input numb 1 - 9:";
        while(!(cin>>choice) || choice == 0 || choice < 1 || choice > 10)
        {
            cin.clear();
            while(cin.get() != '\n');
            cout<<"Error input. Try again:";
        }
            switch(choice)
            {
            case 1:
                cout<<"Input autor of the book:";
                cin>>autor;
                cout<<"Input title of the book:";
                cin>>title;
                cout<<"Input year created of the book:";
                cin>>year;
                obj.setParametr(autor,title,year);
                list.add(obj);
                cout<<"Book add at the catalog."<<endl;
                break;
            case 2:
                cout<<"Input year:";
                cin>>year;
                t = true;
                while(t)
                {
                    t = list.del(year);
                }
                break;
            case 3:
                cout<<"Input autor name:";
                cin>>autor;
                t = true;
                while(t)
                    t = list.del(autor);
                break;
            case 4:
                cout<<"Input title of the book:";
                cin>>title;
                t = true;
                while(t)
                    t = list.del(title);
                break;
            case 5:
                list.print();
                break;
            case 6:
                cout<<"Enter a year for search:";
                cin>>year;
                list.search(year);
                break;
            case 7:
                cout<<"Enter a autor name for search:";
                cin>>autor;
                list.search(autor);
                break;
            case 8:
                cout<<"Enter a title for search:";
                cin>>title;
                list.search(title);
                break;
            case 9:
                system("cls");
                menu();
                cout<<endl;
                break;
            default:
                 break;
            }
    }while(choice != 10);
    Catalog test = list;
    cout<<"==================Print first catalog====================="<<endl;
    list.print();
    cout<<"==================Print second catalog===================="<<endl;
    test.print();
    cout<<"==================Delete first catalog and print=========="<<endl;
    list.FreeMemory();
    list.print();
    cout<<"==================Print second catalog===================="<<endl;
    test.print();
    cout<<"End program."<<endl;
    return 0;
}
Добавлено через 37 минут
проблема решена можно закрывать)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.03.2014, 18:13     оператор = и конструктор копирования
Посмотрите здесь:

C++ Конструктор копирования.
Конструктор копирования и оператор присваивания C++
C++ Про конструктор копирования, оператор присваивания
Очередь, конструктор копирования и перегруженный оператор присваивания C++
Конструктор копирования C++
C++ Ребят, уже запарился, гляньте, что не так!? конструктор копирования и оператор присваивания
Конструктор копирования C++
При удалении объектов происходит порча кучи. Конструктор копирования и оператор = переопределены C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
_include
Студент
 Аватар для _include
52 / 52 / 12
Регистрация: 17.09.2012
Сообщений: 291
Записей в блоге: 2
Завершенные тесты: 1
01.03.2014, 18:33     оператор = и конструктор копирования #2
Hrollo, написали бы как решили, вдруг не вы одни столкнулись с такой проблемой.
Hrollo
34 / 34 / 6
Регистрация: 05.11.2013
Сообщений: 147
01.03.2014, 19:41  [ТС]     оператор = и конструктор копирования #3
если кому пригодится то операция присваивания получилась вот такой:
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
Catalog &Catalog::operator=(const Catalog &c)
{
    List *p = head;//указатель на начало левого списка
    List *p1 = c.head;//указатель на начало левого списка
    bool res = true;//переменная для проверки самоприсваивания
    if(p != NULL)//если левый список не пуст то сделать проверку на самоприсваивание
    {
        while(p)
        {//почленное сравнивание
            if(p->book.getAutor() == p1->book.getAutor() && p->book.getTitle() == p1->book.getTitle() && p->book.getYear() == p1->book.getYear())
                    res = true;
            else
            {
                res = false;
                break;
            }
            p = p->next;//перейти к следующему елементу в левом списке
            p1 = p1->next;//перейти к следующему елементу в правом списке
        }
        if(res == true)//если истина то левый список равен правому вернуть текущий список
            return *this;
    }
    FreeMemory();//очистить память
    if(c.head == NULL)
        return *this;
    List *temp = c.head;//создать новый казатель на начало правого списка
    head = new List;//выделить память для первого елемента списка
    head->book.setAutor(temp->book.getAutor());//присваивание первому елементу значения из второго
    head->book.setTitle(temp->book.getTitle());
    head->book.setYear(temp->book.getYear());
    head->next = NULL;//следующий елемент списка = 0
    temp = temp->next;//сместить указатель правого списка на 1 елемент
    List *begin = head;//указатель на начало левого списка
    while(temp)
    {
        List *t = new List;//выделить новую память
        t->book.setAutor(temp->book.getAutor());//присвоить значения
        t->book.setTitle(temp->book.getTitle());
        t->book.setYear (temp->book.getYear());
        t->next = NULL;
        begin->next = t;
        begin = begin->next;
        temp = temp->next;
    }
    return *this;
}
и вторая ошибка была в мейне, а именно в switch, case 1: нужно было объявить переменную obj класса Book как указатель и в case 1: нужно было выделять ей динамически память, и еще одна ошибка во время создания нового каталога получилось вот так:
C++
1
2
Catalog test;
test = list;
Yandex
Объявления
01.03.2014, 19:41     оператор = и конструктор копирования
Ответ Создать тему
Опции темы

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