teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

5

friend についての説明を追加

2020/03/09 15:21

投稿

kazuma-s
kazuma-s

スコア8222

answer CHANGED
@@ -164,4 +164,20 @@
164
164
  Iterator End() { return Iterator(this, mSize); }
165
165
  };
166
166
  ```
167
- main は省略しました。
167
+ main は省略しました。
168
+
169
+ **追記4**
170
+ friend の意味を誤解していませんか?
171
+ 質問のコードでは、class Iterator の中に frined class Vector; がありますが、
172
+ これは、Iterator の中のメンバ mCurrentIndex や mMyVector が private であっても
173
+ Vector の中のメンバ関数から参照できるようにするものです。
174
+ そんなものが必要でしょうか?
175
+
176
+ 逆に class Vector の中に、frined class Iterator; と書けば、
177
+ Iterator の中のメンバ関数が Vector の中のメンバ mData などを参照できます。
178
+
179
+ 例えば、**追記3** のコードでそう書けば、Vectorのメンバ関数 At がなくても、
180
+ Iterator のメンバ関数 GetData が次のように書けます。
181
+ ```C++
182
+ T& GetData() { return mMyVector->mData[mCurrentIndex]; }
183
+ ```

4

Vector<T> へのポインタをもつコードを追加

2020/03/09 15:21

投稿

kazuma-s
kazuma-s

スコア8222

answer CHANGED
@@ -117,4 +117,51 @@
117
117
  }
118
118
  ```
119
119
  IsEqual は Vector のすべての要素が等しいかどうかではなく、
120
- Iterator が同じ要素を指しているかどうかを調べるものです。
120
+ Iterator が同じ要素を指しているかどうかを調べるものです。
121
+
122
+ **追記3**
123
+ Iterator が Vector<T> へのポインタを持つように書くこともできます。
124
+ ```C++
125
+ #include <iostream>
126
+ using namespace std;
127
+
128
+ template<typename T>
129
+ class Vector {
130
+ T* mData;
131
+ int mSize;
132
+ int mCapacity;
133
+
134
+ public:
135
+ Vector() {
136
+ mSize = 0; mCapacity = 15; mData = new T[mCapacity];
137
+ }
138
+ ~Vector() { delete[] mData; }
139
+ void PushBack(const T& tItem) {
140
+ if (mSize < mCapacity)
141
+ mData[mSize++] = tItem;
142
+ else
143
+ cout << "to be implemented later\n";
144
+ }
145
+ T& At(int i) { return mData[i]; }
146
+
147
+ class Iterator {
148
+ int mCurrentIndex = 0;
149
+ Vector<T> *mMyVector = nullptr;
150
+
151
+ public: // コンストラクタは public に
152
+ Iterator(Vector<T> *tWho, int tLocation) {
153
+ mMyVector = tWho;
154
+ mCurrentIndex = tLocation;
155
+ }
156
+ T& GetData() { return mMyVector->At(mCurrentIndex); }
157
+ void Next() { mCurrentIndex += 1; }
158
+ bool IsEqual(const Iterator& rhs) const {
159
+ return mMyVector == rhs.mMyVector && mCurrentIndex == rhs.mCurrentIndex;
160
+ }
161
+ }; // end of class Iterator definition
162
+
163
+ Iterator Begin() { return Iterator(this, 0); }
164
+ Iterator End() { return Iterator(this, mSize); }
165
+ };
166
+ ```
167
+ main は省略しました。

3

質問者のコードの問題点を指摘

2020/03/09 06:45

投稿

kazuma-s
kazuma-s

スコア8222

answer CHANGED
@@ -56,4 +56,65 @@
56
56
  mData = new T[mCapacity];
57
57
  }
58
58
  ```
59
- さらに、main の a は、Vector<int> a(20); にします。
59
+ さらに、main の a は、Vector<int> a(20); にします。
60
+
61
+ **追記2**
62
+ main が少しずつ実行できるように作っていきましょう。
63
+ ```C++
64
+ #include <iostream>
65
+ using namespace std;
66
+
67
+ template<typename T>
68
+ class Vector {
69
+ T* mData;
70
+ int mSize;
71
+ int mCapacity;
72
+
73
+ public:
74
+ Vector() {
75
+ mSize = 0; mCapacity = 15; mData = new T[mCapacity];
76
+ }
77
+ ~Vector() { delete[] mData; }
78
+ void PushBack(const T& tItem) {
79
+ if (mSize < mCapacity)
80
+ mData[mSize++] = tItem;
81
+ else
82
+ cout << "to be implemented later\n";
83
+ }
84
+
85
+ class Iterator {
86
+ int mCurrentIndex = 0;
87
+ T *mMyVector = nullptr; // not a pointer to Vector<T>
88
+
89
+ public: // コンストラクタは public に
90
+ Iterator(T *tWho, int tLocation) { // not a pointer to Vector<T>
91
+ mMyVector = tWho;
92
+ mCurrentIndex = tLocation;
93
+ }
94
+ T& GetData() { return mMyVector[mCurrentIndex]; }
95
+ void Next() { mCurrentIndex += 1; }
96
+ bool IsEqual(const Iterator& rhs) const {
97
+ return mMyVector == rhs.mMyVector && mCurrentIndex == rhs.mCurrentIndex;
98
+ }
99
+ }; // end of class Iterator definition
100
+
101
+ Iterator Begin() { return Iterator(mData, 0); }
102
+ Iterator End() { return Iterator(mData, mSize); }
103
+ };
104
+
105
+ int main()
106
+ {
107
+ Vector<int> tTester;
108
+ tTester.PushBack(0);
109
+ tTester.PushBack(1);
110
+ tTester.PushBack(2);
111
+
112
+ for (Vector<int>::Iterator iter = tTester.Begin();
113
+ !iter.IsEqual(tTester.End()); iter.Next()) {
114
+ cout << iter.GetData() << " ";
115
+ }
116
+ cout << endl;
117
+ }
118
+ ```
119
+ IsEqual は Vector のすべての要素が等しいかどうかではなく、
120
+ Iterator が同じ要素を指しているかどうかを調べるものです。

2

Vectorのコンストラクタの修正

2020/03/09 05:28

投稿

kazuma-s
kazuma-s

スコア8222

answer CHANGED
@@ -46,4 +46,14 @@
46
46
  cout << it->size() << " " << *it << endl;
47
47
  }
48
48
  ```
49
- Vector のコピーコンストラクタや代入演算子の定義は省略しました。
49
+ Vector のコピーコンストラクタや代入演算子の定義は省略しました。
50
+
51
+ **追記**
52
+ 質問のコードの Vector のコンストラクタの 15 は mSize ではなく mCapacity のデフォルト値だったんですね。
53
+ コンストラクタを次のように修正します。
54
+ ```C++
55
+ Vector(int n = 0) : mSize(n), mCapacity(n < 15 ? 15 : n) {
56
+ mData = new T[mCapacity];
57
+ }
58
+ ```
59
+ さらに、main の a は、Vector<int> a(20); にします。

1

無意味な改行の削除

2020/03/08 16:09

投稿

kazuma-s
kazuma-s

スコア8222

answer CHANGED
@@ -34,7 +34,6 @@
34
34
  Vector<int> a;
35
35
  for (int i = 0; i < a.Size(); i++)
36
36
  a[i] = i + 1;
37
- cout << endl;
38
37
  for (Vector<int>::Iterator it = a.Begin(); it != a.End(); ++it)
39
38
  cout << " " << *it;
40
39
  cout << endl;