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

Констуркторы, деструкторы.... - C++

Восстановить пароль Регистрация
 
CFYZ
 Аватар для CFYZ
10 / 10 / 0
Регистрация: 21.11.2009
Сообщений: 187
03.05.2011, 18:26     Констуркторы, деструкторы.... #1
Необходимо для динамического типа данных описать класс, содержащий указатель на динамический тип как поле данных. Для этого класса описать конструкторы (в том числе и конструктор копирования), деструктор, функцию печати данных. Создать экземпляр полученного класса и проиллюстрировать его корректную работу: распечатать данные, изменить данные и распечатать вновь. Создать второй экземпляр класса как копию первого и проиллюстрировать корректную работу конструктора копирования: распечатать и изменить данные объекта-копии, распечатать данные обоих объектов, сравнить результат. Предусмотреть ошибки.

Динамическая структура – очередь. Хранит библиотечные данные: автора книги (строка) и название книги (строка). Предусмотреть функции добавления элементов в очередь и удаления из нее, а также функцию поиска всех произведений введенного автора.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.05.2011, 18:26     Констуркторы, деструкторы....
Посмотрите здесь:

for_each и деструкторы C++
C++ Деструкторы
C++ Конструкторы и деструкторы
Где деструкторы? C++
C++ Деструкторы
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Somebody
2770 / 1583 / 141
Регистрация: 03.12.2007
Сообщений: 4,139
Завершенные тесты: 1
03.05.2011, 22:42     Констуркторы, деструкторы.... #2
И что не получается?
CFYZ
 Аватар для CFYZ
10 / 10 / 0
Регистрация: 21.11.2009
Сообщений: 187
03.05.2011, 23:45  [ТС]     Констуркторы, деструкторы.... #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
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
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
 
//---------------------------------------------------------------------------
 
#include <iostream.h>
#include <conio.h>
#include <string.h>
 
class book
{
    struct ListElement
   {
      string avtor,name;
      ListElement* Next;
   };
   ListElement *First;
   ListElement *Last;
   ListElement *Current;
   public:
     book();
    ~book();
     book(const book & thebook){
     Current=First;
     while (Current){
     Current->avtor=thebook.Current->avtor;
     Current->name=thebook.Current->name;
     Current=Current->Next;
     }
     };
     void dob();
     int udal();
     void poisk(string value);
     void show();
};
 
 
book::book():
First(NULL),Last(NULL),Current(NULL)
{}
 
book::~book()
{
  while(First)
   {
      Current=First;
      First=Current->Next;
      delete Current;
   }
}
 
int book::udal()
{
   clrscr();
   Current=First;
   if (Current)
   {
      First=Current->Next;
      delete Current;
      return 1;
   }
   else
   {
      return 0;
   }
}
 
void book::dob()
{
   clrscr();
   string a,b;
   int j,i;
   cout<<"Vvedite kol-vo elementov ocheredi"<<endl;
   cin>>j;
   for (i=0;i<j;i++){
   if(!First)
   {
      if(!(Last= new ListElement))
      {
         cerr<<"Insufficient memory for element"<<endl;
         return;
      }
      cout<<"Vvedite avtora"<<endl;
      cin>>a;
      cout<<"Vvedite nazvanie knigi"<<endl;
      cin>>b;
      Last->avtor=a;
      Last->name=b;
      First=Last;
      Last->Next=NULL;
   }
   else
   {
      if(!(Current= new ListElement))
      {
         cerr<<"Insufficient memory for element"<<endl;
         return;
      }
      cout<<"Vvedite avtora"<<endl;
      cin>>a;
      cout<<"Vvedite nazvanie knigi"<<endl;
      cin>>b;
      Current->avtor=a;
      Current->name=b;
      Last->Next=Current;
      Last=Current;
      Last->Next=NULL;
   }
  }
 return;
}
 
void book::show()
{
   clrscr();
   Current=First;
   while(Current)
   {
      cout<<Current->avtor<<" ";
      cout<<Current->name<<endl;
      Current=Current->Next;
   }
   getch();
   return;
}
 
void book::poisk(string value)
{
   clrscr();
   string l;
   Current=First;
   int i=0;
   while(Current)
   {
      if (Current->avtor==value)
      {
         cout<<value<<":";
         l=Current->name;
         cout<<l<<endl;
         i++;
      }
      Current=Current->Next;
   }
   if (i==0)
   cout<<"proizvedenii c takim nazvaniem net"<<endl;
   getch();
   return;
}
 
void main(){
char c;
string val;
book BOOK;
while(1){
  clrscr();
  cout<<"1-Dobavlenie"<<endl;
  cout<<"2-Udalenie"<<endl;
  cout<<"3-Pokazat spisok"<<endl;
  cout<<"4-Poisk"<<endl;
  cout<<"5-Exit"<<endl;
  c=cin.get();
 
  switch(c){
  case'1':BOOK.dob();break;
  case'2':BOOK.udal();break;
  case'3':BOOK.show();break;
  case'4':{
       cout<<"Vvedite element poiska"<<endl;
       cin>>val;
       BOOK.poisk(val); break;}
  case'5':exit(0);
  }
 }
}
lemegeton
 Аватар для lemegeton
2910 / 1339 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
04.05.2011, 23:14     Констуркторы, деструкторы.... #4
You're not going tolike it.
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
#include <iostream>
#include <cstring>
 
class Book {
 public:
  class IsAuthor {
   public:
    IsAuthor(const char *value)
      : value_(strcpy(new char[strlen(value) + 1], value)){}
    ~IsAuthor() { delete value_; }
    bool operator()(const Book &book) {
      return strcmp(book.Author(), value_) == 0;
    }
   private:
    char *value_;
  };
  Book() : author_(NULL), name_(NULL) {}
  Book(const char *author, const char *name)
    : author_(strcpy(new char[strlen(author) + 1], author)),
      name_(strcpy(new char[strlen(name) + 1], name)) {}
  Book(const Book &other)
    : author_(strcpy(new char[strlen(other.Author()) + 1], other.Author())),
      name_(strcpy(new char[strlen(other.Name()) + 1], other.Name())) {}
  ~Book() {
    delete [] author_;
    delete [] name_;
  }
  char *Name() const { return name_; }
  char *Author() const { return author_; }
  void Name(const char *value) {
    delete [] name_;
    name_ = strcpy(new char[strlen(value) + 1], value);
  }
  void Author(const char *value) {
    delete [] author_;
    author_ = strcpy(new char[strlen(value) + 1], value);
  }
  Book &operator=(const Book &other) {
    if (&other != this) {
      Name(other.Name());
      Author(other.Author());
    }
    return *this;
  }
  friend std::ostream &operator<<(std::ostream &stream, const Book &book) {
    return stream << "Author: " << book.Author() << std::endl
                  << "Name: " << book.Name() << std::endl;
  }
 private:
  char *author_;
  char *name_;
};
 
template <class ValueType>
class Queue {
 public:
  struct ListItem {
    ValueType data;
    ListItem *next;
    ListItem() : data(), next(NULL) {}
    ListItem(const ValueType &value) : data(value), next(NULL) {}
  };
  Queue() : begin_(NULL), end_(NULL), size_(0) {}
  Queue(const Queue &other) : begin_(NULL), end_(NULL), size_(0) {
    ListItem *item = other.begin_;
    while (item != NULL) {
      PushBack(item->data);
      item = item->next;
    }
  }
  ~Queue() {
    Clear();
  }
  size_t Size() const { return size_; }
  void PushBack(const ValueType &value) {
    ListItem *new_item = new ListItem(value);
    if (begin_ == NULL) {
      begin_ = end_ = new_item;
    } else {
      end_->next = new_item;
      end_ = new_item;
    }
    ++size_;
  }
  ValueType PopBack() {
    ValueType result = end_->data;
    if (begin_ == end_) {
      delete end_;
      begin_ = end_ = NULL;
    } else {
      ListItem *pre_last = begin_;
      while (pre_last->next != end_)
        pre_last = pre_last->next;
      pre_last->next = NULL;
      delete end_;
      end_ = pre_last;
    }
    --size_;
    return result;
  }
  ValueType &Begin() { return begin_->data; }
  ValueType &End() { return end_->data; }
  void Clear() {
    if (begin_ != NULL)
    while (begin_->next != NULL) {
      ListItem *tmp = begin_->next;
      delete begin_;
      begin_ = tmp;
    }
    begin_ = end_ = NULL;
    size_ = 0;
  }
  template <class Predicate>
  void CopyIf(Queue &destination, Predicate predicate) {
    ListItem *item = begin_;
    while (item != NULL) {
      if (predicate(item->data))
        destination.PushBack(item->data);
      item = item->next;
    }
  }
  friend std::ostream &operator<<(std::ostream &stream, const Queue &list) {
    ListItem *item = list.begin_;
    while (item != NULL) {
      stream << item->data << std::endl;
      item = item->next;
    }
    return stream;
  }
 private:
  ListItem *begin_;
  ListItem *end_;
  size_t size_;
};
 
int main(int argc, char *argv[]) {
  Queue<Book> queue;
  
  queue.PushBack(Book("Prattchet", "Colour of Sky, The"));
  queue.PushBack(Book("Melville", "Moby-Dick"));
  queue.PushBack(Book("Prattchet", "Wizzard"));
 
  Queue<Book> copied(queue), authored;
  queue.CopyIf(authored, Book::IsAuthor("Prattchet"));
 
  std::cout << "* All:" << std::endl << queue;
  std::cout << "* Copy:" << std::endl << copied;
  
  std::cout << "* Last book: " << copied.PopBack() << std::endl;
 
  copied.Begin().Author("Terry Prattchet");
  copied.End().Author("Herman Melville");
  std::cout << "* Modified copy:" << std::endl << copied;
  
  std::cout << "* Only prattchet:" << std::endl << authored;
  return 0;
}
CFYZ
 Аватар для CFYZ
10 / 10 / 0
Регистрация: 21.11.2009
Сообщений: 187
31.05.2011, 13:22  [ТС]     Констуркторы, деструкторы.... #5
Для этого класса описать конструкторы (в том числе и конструктор копирования), деструктор, функцию печати данных. Создать экземпляр полученного класса и проиллюстрировать его корректную работу: распечатать данные, изменить данные и распечатать вновь. Создать второй экземпляр класса как копию первого и проиллюстрировать корректную работу конструктора копирования: распечатать и изменить данные объекта-копии, распечатать данные обоих объектов, сравнить результат. Предусмотреть ошибки.


Помогите реализовать в моей программе выделенный КРАСНЫМ фрагмент задания.


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
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
 
//---------------------------------------------------------------------------
 
#include <iostream.h>
#include <conio.h>
#include <string.h>
 
class book
{
    struct ListElement
   {
      string avtor,name;
      ListElement* Next;
   };
   ListElement *First;
   ListElement *Last;
   ListElement *Current;
   public:
     book();
    ~book();
     book(const book & thebook){
     Current=First;
     while (Current){
     Current->avtor=thebook.Current->avtor;
     Current->name=thebook.Current->name;
     Current=Current->Next;
     }
     };
     void dob();
     int udal();
     void poisk(string value);
     void show();
};
 
 
book::book():
First(NULL),Last(NULL),Current(NULL)
{}
 
book::~book()
{
  while(First)
   {
      Current=First;
      First=Current->Next;
      delete Current;
   }
}
 
int book::udal()
{
   clrscr();
   Current=First;
   if (Current)
   {
      First=Current->Next;
      delete Current;
      return 1;
   }
   else
   {
      return 0;
   }
}
 
void book::dob()
{
   clrscr();
   string a,b;
   int j,i;
   cout<<"Vvedite kol-vo elementov ocheredi"<<endl;
   cin>>j;
   for (i=0;i<j;i++){
   if(!First)
   {
      if(!(Last= new ListElement))
      {
         cerr<<"Insufficient memory for element"<<endl;
         return;
      }
      cout<<"Vvedite avtora"<<endl;
      cin>>a;
      cout<<"Vvedite nazvanie knigi"<<endl;
      cin>>b;
      Last->avtor=a;
      Last->name=b;
      First=Last;
      Last->Next=NULL;
   }
   else
   {
      if(!(Current= new ListElement))
      {
         cerr<<"Insufficient memory for element"<<endl;
         return;
      }
      cout<<"Vvedite avtora"<<endl;
      cin>>a;
      cout<<"Vvedite nazvanie knigi"<<endl;
      cin>>b;
      Current->avtor=a;
      Current->name=b;
      Last->Next=Current;
      Last=Current;
      Last->Next=NULL;
   }
  }
 return;
}
 
void book::show()
{
   clrscr();
   Current=First;
   while(Current)
   {
      cout<<Current->avtor<<" ";
      cout<<Current->name<<endl;
      Current=Current->Next;
   }
   getch();
   return;
}
 
void book::poisk(string value)
{
   clrscr();
   string l;
   Current=First;
   int i=0;
   while(Current)
   {
      if (Current->avtor==value)
      {
         cout<<value<<":";
         l=Current->name;
         cout<<l<<endl;
         i++;
      }
      Current=Current->Next;
   }
   if (i==0)
   cout<<"proizvedenii c takim nazvaniem net"<<endl;
   getch();
   return;
}
 
void main(){
char c;
string val;
book BOOK;
while(1){
  clrscr();
  cout<<"1-Dobavlenie"<<endl;
  cout<<"2-Udalenie"<<endl;
  cout<<"3-Pokazat spisok"<<endl;
  cout<<"4-Poisk"<<endl;
  cout<<"5-Exit"<<endl;
  c=cin.get();
 
  switch(c){
  case'1':BOOK.dob();break;
  case'2':BOOK.udal();break;
  case'3':BOOK.show();break;
  case'4':{
       cout<<"Vvedite element poiska"<<endl;
       cin>>val;
       BOOK.poisk(val); break;}
  case'5':exit(0);
  }
 }
}
lemegeton
 Аватар для lemegeton
2910 / 1339 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
01.06.2011, 09:35     Констуркторы, деструкторы.... #6
Боюсь, что вышеприведенный код содержит огромное количество ошибок и неработоспособен. Попробуйте воспользоваться фрагментами приведенного мною кода.
CFYZ
 Аватар для CFYZ
10 / 10 / 0
Регистрация: 21.11.2009
Сообщений: 187
06.06.2011, 21:36  [ТС]     Констуркторы, деструкторы.... #7
Цитата Сообщение от lemegeton Посмотреть сообщение
Боюсь, что вышеприведенный код содержит огромное количество ошибок и неработоспособен. Попробуйте воспользоваться фрагментами приведенного мною кода.

К сожалению, я еще не так хорошо C++ и поэтому не смог разобраться в Вашем коде.
Возможно Вы могли бы его упростить, до минимального уровня, что бы он был похож на мой код?
Заранее благодарен.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.06.2011, 00:53     Констуркторы, деструкторы....
Еще ссылки по теме:

Конструкторы и деструкторы C++
Деструкторы C++
C++ Виртуальные деструкторы

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

Или воспользуйтесь поиском по форуму:
lemegeton
 Аватар для lemegeton
2910 / 1339 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
07.06.2011, 00:53     Констуркторы, деструкторы.... #8
Проще не выйдет, но можно сделать примитивней.
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
#include <iostream>
#include <string>
 
struct Book {
  std::string author;
  std::string name;
  Book() : author(""), name("") {}
  Book(const std::string &author_, const std::string name_)
    : author(author_), name(name_) {}
};
 
class SimpleQueue {
 public:
  SimpleQueue() { base_.next = base_.prev = &base_; }
  SimpleQueue(const SimpleQueue  &other) {
    base_.next = base_.prev = &base_;
    NodeBase *node = other.base_.next;
    while (node != &(other.base_)) {
      PushBack(static_cast<Node*>(node)->value);
      node = node->next;
    }
  }
  ~SimpleQueue() { Clear(); }
  void PopFront() {
    // тут надо предусмотреть, что список не пуст
    Node *node = static_cast<Node*>(base_.next);
    node->prev->next = node->next;
    node->next->prev = node->prev;
    delete node;
  }
  Book &Front() const {
    // тут надо предусмотреть, что список не пуст
    return static_cast<Node*>(base_.prev)->value;
  }
  void PushBack(const Book &value) {
    Node *node = new Node;
    node->value = value;
    node->next = &base_;
    node->prev = base_.prev;
    node->next->prev = node->prev->next = node;
  }
  bool Empty() {
    return (base_.next == &base_) && (base_.prev == &base_);
  }
  void Clear() {
    while (!Empty())
      PopFront();
  }
  void Print() {
    for (NodeBase *node = base_.next; node != &base_; node = node->next)
      std::cout << "Author: "<< static_cast<Node*>(node)->value.author
                << std::endl
                << "Name: " << static_cast<Node*>(node)->value.name
                << std::endl << "-----" << std::endl;
  }
  SimpleQueue AuthoredBy(const std::string &author) {
    SimpleQueue result;
    for (NodeBase *node = base_.next; node != &base_; node = node->next)
      if (static_cast<Node*>(node)->value.author == author)
        result.PushBack(static_cast<Node*>(node)->value);
    return result;
  }
 private:
  struct NodeBase {
    NodeBase *next;
    NodeBase *prev;
  };
  struct Node: public NodeBase {
    Book value;
  };
  NodeBase base_;
};
 
int main(int argc, char *argv[]) {
  SimpleQueue queue;
 
  queue.PushBack(Book("Prattchet", "Colour of Sky, The"));
  queue.PushBack(Book("Melville", "Moby-Dick"));
  queue.PushBack(Book("Prattchet", "Wizzard"));
 
  SimpleQueue copy(queue);
  queue.PopFront();
  
  std::cout << std::endl << "Queue:" << std::endl << std::endl;
  queue.Print();
 
  std::cout << std::endl << "Copy:" << std::endl << std::endl;
  copy.Print();
 
  std::cout << std::endl << "Authored by Prattchet:" << std::endl << std::endl;
  copy.AuthoredBy("Prattchet").Print();
  return 0;
}
Добавлено через 5 минут
Цитата Сообщение от CFYZ Посмотреть сообщение
Возможно Вы могли бы его упростить, до минимального уровня, что бы он был похож на мой код?
К сожалению, до минимального уровня не могу. По меньшей мере не могу использовать односимвольные или не говорящие идентификаторы -- путаюсь. Ну и общая стилистика уже как-то устоялась. Но вы можете всё это легко исправить с помощью инструмента замены в вашем любимом текстовом редакторе.

Не по теме:

Цитата Сообщение от CFYZ Посмотреть сообщение
Подправьте если не сложно, что бы это выглядело более профессионально.
Цитата Сообщение от CFYZ Посмотреть сообщение
Возможно Вы могли бы его упростить, до минимального уровня, что бы он был похож на мой код?
Вам шашечки или ехать?

Yandex
Объявления
07.06.2011, 00:53     Констуркторы, деструкторы....
Ответ Создать тему
Опции темы

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