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

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

Восстановить пароль Регистрация
Другие темы раздела
C++ Не могу понять, как правильно передать указатель на объект в файл http://www.cyberforum.ru/cpp-beginners/thread1108504.html
Есть вектор v, который надо отсортировать. Есть класс MergeSort, который это должен делать, он содержит в качестве параметра указатель на вектор. Т.е. я хотел сделать так, что за конкретным объектом класса закреплялся бы навсегда конкретный вектор, и вызывая элемент-функцию .sort(), всегда можно было бы отсортировать закрепленный за классом вектор. Но вот не задача, если поменять вектор, и после...
C++ Чтение входных данных размером больше чем 4096 символов Даны такие условия задачи, что входные данные введенные с клавиатуры (из файла) могут достигать 10 000 символов их надо соответственно обработать. Когда размер входных данных равен от 5 000 до 10 000 символов, считываются не все, а только первых 4096 символов. Считывание данных введенных с консоли я делаю таким образом: string* str=new string; //считанные строки. //... for (int i=0; i<k; i++)... http://www.cyberforum.ru/cpp-beginners/thread1108487.html
C++ Рекурсивная функция рисования кривой
Помогите перевести код: unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls; type
C++ Реализация одно-х списков классами
Добрый день! Расскажите пожалуйста, как эту задачу можно написать с помощью классов. L – линейный однонаправленный список Проверить, упорядочены ли элементы списка по алфавиту.
C++ ООП. Метод считывания текста с PDF файла http://www.cyberforum.ru/cpp-beginners/thread1108458.html
Напишите пожалуйста метод считывания текста с PDF файла. Очень нужно, помогите пожалуйста!
C++ Ссылка на объект, возвращаемый функцией Безопасно ли подобное? typedef std::vector< string > vec; vec someFoo(); vec someBoo() { // что-то делаем vec & x = someFoo(); // что-то делаем с вектором 'x', удаляем некоторые элементы return x; подробнее

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

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 минут
проблема решена можно закрывать)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 23:35. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru