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

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

Войти
Регистрация
Восстановить пароль
 
fuzzytoozy
8 / 8 / 1
Регистрация: 23.11.2012
Сообщений: 94
#1

Перегрузка оператора постфиксной инкрементации - C++

28.03.2014, 22:56. Просмотров 367. Ответов 2
Метки нет (Все метки)

Пытался набросать простенький контейнер с итератором. Вот код:
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
#include <iostream>
 
template<typename Item>
class Vector{
private:
  friend class iterator;
  int max_size;
  int current_size;
 
public:
  Item* data_array;
  class iterator{
  private:
    friend class Vector;
    Item* data_array;
    int current_pos;
    int end_pos;
    
  public:
    iterator(){
      this->data_array = 0;
      this->current_pos = 0;
      this->end_pos = 0;
    }
    
    iterator(const Vector& container){
      this->data_array = container.data_array;
      this->current_pos = 0;
      this->end_pos = container.max_size;
    }
 
    iterator& operator=(const iterator& iter)const{
      this->data_array = iter.data_array;
      this->current_pos = iter.current_pos;
      this->end_pos = iter.end_pos;
    }
    
 
    iterator& operator++(){
      std::cout << "Prefix called\n";
      ++this->current_pos;
      return *this;
    }
 
    iterator operator++(int){
      std::cout << "Postfix called\n";
      iterator temp = *this;
      this->current_pos++;
      return temp;
    }
 
    Item& operator*(){
      return data_array[current_pos];
    }
 
    const Item& operator*()const{
      return  data_array[current_pos];
    }
  };
  
  Vector(int size = 15){
    this->current_size = 0;
    this->max_size = size;
    this->data_array = new Item[max_size];
  }
 
  ~Vector(){
    delete [] this->data_array;
  }
 
  iterator begin(){
    return iterator(*this);
  }
    
  void push_back(Item& data){
    if(this->current_size == this->max_size){
      this->max_size *= 2;
      Item* temp = new Item[this->max_size];
 
      for(int i = 0; i < this->current_size; i++){
    temp[i] = this->data_array[i];
      }
      
      delete []this->data_array;
      this->data_array = temp;
      this->data_array[current_size++] = data;
    }
    else{
      this->data_array[current_size++] = data;
    }
  }
};
 
  int main(){
    
    Vector<int>* v = new Vector<int>();
 
    for(int i = 0; i < 20; i++){
      v->push_back(i);
    }
    
    Vector<int>::iterator it = v->begin();
    
    for(int i = 0; i < 20; ++i){
      std::cout << *(it++) << " ";
    }
  }
Все вроде бы прекрасно работает если я тестирую его вот так:
C++
1
2
3
4
    for(int i = 0; i < 20; ++i){
      std::cout << *it << " ";
      it++;
    }
Вывод программы таков:
0 Postfix called
1 Postfix called
2 Postfix called
3 Postfix called
4 Postfix called
5 Postfix called
6 Postfix called
7 Postfix called
8 Postfix called
9 Postfix called
10 Postfix called
11 Postfix called
12 Postfix called
13 Postfix called
14 Postfix called
15 Postfix called
16 Postfix called
17 Postfix called
18 Postfix called
19 Postfix called
Но если я тестирую таким вот образом:
C++
1
2
3
    for(int i = 0; i < 20; ++i){
      std::cout << *(it++) << " ";
    }
Вывод почему то становится вот таким:
D:\exc>vector.exe
Postfix called
0 Postfix called
1 Postfix called
2 Postfix called
3 Postfix called
4 Postfix called
5 Postfix called
6 Postfix called
7 Postfix called
8 Postfix called
9 Postfix called
10 Postfix called
11 Postfix called
12 Postfix called
13 Postfix called
14 Postfix called
15 Postfix called
16 Postfix called
17 Postfix called
18 Postfix called
19
У кого нибудь есть соображения по этому поводу?
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.03.2014, 22:56
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Перегрузка оператора постфиксной инкрементации (C++):

перегрузка постфиксной и префиксной формы оператора ++ - C++
доброго времени суток форумчане, у меня такой вопрос, как перегрузить оператор ++ все другие операторы уже перегрузил осталась...

Перегрузка постфиксной и префиксной операции инкремента - C++
Здравствуйте! У меня возник вопрос: почему выводит разный результат, казалось бы, одинаковый код Вот здесь выводит как должно: ...

Перегрузка оператора = - C++
Нужно перегрузить оператор так что бы в начале строки и в конце были квадратные скобки . Все почти работает только вот вывод на экран не...

Перегрузка оператора [] - C++
Всем привет! Как можно перегрузить оператор так, чтобы к нему можно было обращаться так: class_arr = 5; Где class_arr - переменная...

Перегрузка оператора << - C++
Здравствуйте форумчане, помогите исправить ошибку. Вообщем есть класс с перегруженным оператором &lt;&lt; . Category.h class...

Перегрузка оператора = - C++
Здравствуйте, возникла проблема при перегрузке оператора. const digit &amp;operator=( const int &amp; ); const digit &amp;operator=( const char...

2
DrOffset
7321 / 4421 / 1001
Регистрация: 30.01.2014
Сообщений: 7,259
28.03.2014, 23:02 #2
fuzzytoozy, а что тебя смущает?
0
SatanaXIII
Супер-модератор
Эксперт С++
5616 / 2651 / 246
Регистрация: 01.11.2011
Сообщений: 6,530
Завершенные тесты: 1
28.03.2014, 23:15 #3
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
fuzzytoozy, в первом случае вы сначала выводите значение итератора, а следующим действием его увеличиваете. Во втором наоборот - сперва увеличиваете, затем выводите.
Измените для наглядности вывод вот так, добавив перевод строки:
C++
1
2
    for(int i = 0; i < 20; ++i){
      std::cout << *(it++) << std::endl;
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.03.2014, 23:15
Привет! Вот еще темы с ответами:

Перегрузка оператора *= - C++
Переписываю свой матричный калькулятор и решил внести в него перегрузку оператора *= Matrix* Matrix::operator *=(double num){ ...

Перегрузка оператора - C++
Доброго времени суток. Столкнулся с проблемой перегрузки оператора &quot;++&quot; выдает ошибку в первой строке: postfix ‘const Counter...

Перегрузка оператора [] - C++
Здравствуйте. Пробую перегрузить оператор . template &lt;class Element&gt; class List { public: struct Node { Element el; ...

Перегрузка оператора == - C++
нужно сравнить 1) объект класса abc с объектом класса abc1 2) объект класса abc с другим объектом класса abc 3) объект класса abc1...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

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