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

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

Восстановить пароль Регистрация
 
fuzzytoozy
8 / 8 / 1
Регистрация: 23.11.2012
Сообщений: 94
28.03.2014, 22:56     Перегрузка оператора постфиксной инкрементации #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
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
У кого нибудь есть соображения по этому поводу?
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.03.2014, 22:56     Перегрузка оператора постфиксной инкрементации
Посмотрите здесь:

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

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DrOffset
6425 / 3799 / 880
Регистрация: 30.01.2014
Сообщений: 6,592
28.03.2014, 23:02     Перегрузка оператора постфиксной инкрементации #2
fuzzytoozy, а что тебя смущает?
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5548 / 2562 / 233
Регистрация: 01.11.2011
Сообщений: 6,332
Завершенные тесты: 1
28.03.2014, 23:15     Перегрузка оператора постфиксной инкрементации #3
Сообщение было отмечено автором темы, экспертом или модератором как ответ
fuzzytoozy, в первом случае вы сначала выводите значение итератора, а следующим действием его увеличиваете. Во втором наоборот - сперва увеличиваете, затем выводите.
Измените для наглядности вывод вот так, добавив перевод строки:
C++
1
2
    for(int i = 0; i < 20; ++i){
      std::cout << *(it++) << std::endl;
Yandex
Объявления
28.03.2014, 23:15     Перегрузка оператора постфиксной инкрементации
Ответ Создать тему
Опции темы

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