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

Дополнить класс динамическим массивом - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Исходники GDI http://www.cyberforum.ru/cpp-beginners/thread781029.html
Может кто поделиться какими-нибудь исходниками связаными с использованием графики? А то не знаю как подступиться. В книжках есть куски кода, но даже не знаю как их вставить и куда. При компиляции...
C++ тестовая программа не компилируется = "error: 'mainfunc' was not declared in this scope|" Решил ознакомится с Си, пишу простой код: #include <iostream> #include <windows.h> #include <stdio.h> using namespace std; int main() { http://www.cyberforum.ru/cpp-beginners/thread781018.html
Ошибка C++
Проект в котором базовый абстрактный класс Colection, и два производных Vector и Steck в хедоры которых подключаем базовый. Как исправить ошибку? фрагменты из программы #include "Steck.h" ...
C++ Доработать программу ( мизер )
Помогите доработать программу! С меню работает не правильно: // #include "StdAfx.h" #include <cstdio> #include <windows.h> #include <cmath>
C++ удаления узла в двухсвязном списке http://www.cyberforum.ru/cpp-beginners/thread781011.html
Привет всем! такая проблема , не получается корректно удалить узел из двухвязного списка. как решить эту проблему ? #include <iostream> #include <stdlib.h> using namespace std; struct Node {...
C++ Лимит памяти для решений задач Чем руководствуются авторы задач, устанавливая лимт памяти для программ-решений? Например, простая задча. Её решение, сохранённое в текстовом режиме (блокнот) занимает на диске 4 килобайта.... подробнее

Показать сообщение отдельно
lemegeton
2925 / 1354 / 135
Регистрация: 29.11.2010
Сообщений: 2,725
07.02.2013, 12:39
Это пример из справочника по плохому стилю кода, что-ли? Плохо практически везде, поэтому не буду перечислять, а приведу сразу реализацию. По спецификации, в том же плохом стиле, хоть местами и не удержался, сделал по-лучше.


Компилил, не проверял -- рука не поднимается.
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
#include <stdexcept>
 
class sequence {
 public:
  // TYPEDEFS and MEMBER CONSTANTS
  typedef double value_type;
  typedef std::size_t size_type;
  static const size_type DEFAULT_CAPACITY = 30;
  // CONSTRUCTORS and DESTRUCTOR
  sequence(size_type initial_capacity = DEFAULT_CAPACITY);
  sequence(const sequence& source);
  ~sequence();
  // MODIFICATION MEMBER FUNCTIONS
  void resize(size_type new_capacity);
  void start();
  void advance();
  void insert(const value_type& entry);
  void attach(const value_type& entry);
  void remove_current();
  void operator =(const sequence& source);
  void copy_from(const sequence &source);
  // CONSTANT MEMBER FUNCTIONS
  size_type size() const;
  bool is_item() const;
  value_type current() const;
 private:
  value_type* data;
  size_type used;
  size_type current_index;
  size_type capacity;
};
 
// CONSTRUCTOR for the sequence class:
//   sequence(size_t initial_capacity = DEFAULT_CAPACITY)
//     Postcondition: The sequence has been initialized as an empty sequence.
//     The insert/attach functions will work efficiently (without allocating
//     new memory) until this capacity is reached.
sequence::sequence(size_type initial_capacity)
  : data(0), used(0), current_index(0), capacity(0) {
  resize(initial_capacity);
}
 
// VALUE SEMANTICS for the sequence class:
//    Assignments and the copy constructor may be used with sequence objects.
sequence::sequence(const sequence& source)
  : data(0), used(0), current_index(0), capacity(0) {
  copy_from(source);
}
 
sequence::~sequence() {
  delete [] data;
}
 
// COPYING FUNCTION
// copies a sequence into current sequence
void sequence::copy_from(const sequence &source) {
  if (this != &source) {
    delete [] this->data;
    this->used = source.used;
    this->current_index = source.current_index;
    this->capacity = source.capacity;
    this->data = new value_type[capacity];
    for (size_type i = 0; i < this->used; ++i) {
      this->data[i] = source.data[i];
    }
  }
}
 
//   void resize(size_type new_capacity)
//     Postcondition: The sequence's current capacity is changed to the 
//     new_capacity (but not less that the number of items already on the
//     list). The insert/attach functions will work efficiently (without
//     allocating new memory) until this new capacity is reached.
void sequence::resize(size_type new_capacity) {
  new_capacity = (new_capacity < used) ? used : new_capacity;
  // no meaningless action
  if (new_capacity == capacity) {
    return;
  }
  value_type *new_data = new value_type[new_capacity];
  for (size_type i = 0; i < used; ++i) {
    new_data[i] = data[i];
  }
  delete [] data;
  data = new_data;
  capacity = new_capacity;
}
 
//   void start( )
//     Postcondition: The first item on the sequence becomes the current item
//     (but if the sequence is empty, then there is no current item).
void sequence::start() {
  current_index = 0;
}
 
//   void advance( )
//     Precondition: is_item returns true.
//     Postcondition: If the current item was already the last item in the
//     sequence, then there is no longer any current item. Otherwise, the new
//     current item is the item immediately after the original current item.
void sequence::advance() {
  ++current_index;
}
 
//   void insert(const value_type& entry)
//     Postcondition: A new copy of entry has been inserted in the sequence
//     before the current item. If there was no current item, then the new entry 
//     has been inserted at the front of the sequence. In either case, the newly
//     inserted item is now the current item of the sequence.
void sequence::insert(const value_type &entry) {
  if (size() >= capacity) {
    resize(size() + 1);
  }
  for (size_type i = size(); i > current_index; --i) {
    data[i] = data[i - 1];
  }
  ++used;
  data[current_index] = entry;
}
 
//   void attach(const value_type& entry)
//     Postcondition: A new copy of entry has been inserted in the sequence after
//     the current item. If there was no current item, then the new entry has 
//     been attached to the end of the sequence. In either case, the newly
//     inserted item is now the current item of the sequence.
void sequence::attach(const value_type& entry) {
  if (is_item()) {
    advance();
  }
  insert(entry);
}
 
//   void remove_current( )
//     Precondition: is_item returns true.
//     Postcondition: The current item has been removed from the sequence, and the
//     item after this (if there is one) is now the new current item.
void sequence::remove_current() {
  if (is_item()) {
    for (size_type i = current_index; i < size(); ++i) {
      data[i] = data[i + 1];
    }
    --used;
  }
}
 
//   size_type size( ) const
//     Postcondition: The return value is the number of items in the sequence.
sequence::size_type sequence::size() const {
  return used;
}
 
//   bool is_item( ) const
//     Postcondition: A true return value indicates that there is a valid
//     "current" item that may be retrieved by activating the current
//     member function (listed below). A false return value indicates that
//     there is no valid current item.
bool sequence::is_item() const {
  return current_index < used;
}
 
//   value_type current( ) const
//     Precondition: is_item( ) returns true.
//     Postcondition: The item returned is the current item in the sequence.
sequence::value_type sequence::current() const {
  if (!is_item()) {
    throw std::overflow_error("no more elements in sequence");
  }
  return data[current_index];
}
1
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru