回答編集履歴

5

friend についての説明を追加

2020/03/09 15:21

投稿

kazuma-s
kazuma-s

スコア8224

test CHANGED
@@ -331,3 +331,35 @@
331
331
  ```
332
332
 
333
333
  main は省略しました。
334
+
335
+
336
+
337
+ **追記4**
338
+
339
+ friend の意味を誤解していませんか?
340
+
341
+ 質問のコードでは、class Iterator の中に frined class Vector; がありますが、
342
+
343
+ これは、Iterator の中のメンバ mCurrentIndex や mMyVector が private であっても
344
+
345
+ Vector の中のメンバ関数から参照できるようにするものです。
346
+
347
+ そんなものが必要でしょうか?
348
+
349
+
350
+
351
+ 逆に class Vector の中に、frined class Iterator; と書けば、
352
+
353
+ Iterator の中のメンバ関数が Vector の中のメンバ mData などを参照できます。
354
+
355
+
356
+
357
+ 例えば、**追記3** のコードでそう書けば、Vectorのメンバ関数 At がなくても、
358
+
359
+ Iterator のメンバ関数 GetData が次のように書けます。
360
+
361
+ ```C++
362
+
363
+ T& GetData() { return mMyVector->mData[mCurrentIndex]; }
364
+
365
+ ```

4

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

2020/03/09 15:21

投稿

kazuma-s
kazuma-s

スコア8224

test CHANGED
@@ -237,3 +237,97 @@
237
237
  IsEqual は Vector のすべての要素が等しいかどうかではなく、
238
238
 
239
239
  Iterator が同じ要素を指しているかどうかを調べるものです。
240
+
241
+
242
+
243
+ **追記3**
244
+
245
+ Iterator が Vector<T> へのポインタを持つように書くこともできます。
246
+
247
+ ```C++
248
+
249
+ #include <iostream>
250
+
251
+ using namespace std;
252
+
253
+
254
+
255
+ template<typename T>
256
+
257
+ class Vector {
258
+
259
+ T* mData;
260
+
261
+ int mSize;
262
+
263
+ int mCapacity;
264
+
265
+
266
+
267
+ public:
268
+
269
+ Vector() {
270
+
271
+ mSize = 0; mCapacity = 15; mData = new T[mCapacity];
272
+
273
+ }
274
+
275
+ ~Vector() { delete[] mData; }
276
+
277
+ void PushBack(const T& tItem) {
278
+
279
+ if (mSize < mCapacity)
280
+
281
+ mData[mSize++] = tItem;
282
+
283
+ else
284
+
285
+ cout << "to be implemented later\n";
286
+
287
+ }
288
+
289
+ T& At(int i) { return mData[i]; }
290
+
291
+
292
+
293
+ class Iterator {
294
+
295
+ int mCurrentIndex = 0;
296
+
297
+ Vector<T> *mMyVector = nullptr;
298
+
299
+
300
+
301
+ public: // コンストラクタは public に
302
+
303
+ Iterator(Vector<T> *tWho, int tLocation) {
304
+
305
+ mMyVector = tWho;
306
+
307
+ mCurrentIndex = tLocation;
308
+
309
+ }
310
+
311
+ T& GetData() { return mMyVector->At(mCurrentIndex); }
312
+
313
+ void Next() { mCurrentIndex += 1; }
314
+
315
+ bool IsEqual(const Iterator& rhs) const {
316
+
317
+ return mMyVector == rhs.mMyVector && mCurrentIndex == rhs.mCurrentIndex;
318
+
319
+ }
320
+
321
+ }; // end of class Iterator definition
322
+
323
+
324
+
325
+ Iterator Begin() { return Iterator(this, 0); }
326
+
327
+ Iterator End() { return Iterator(this, mSize); }
328
+
329
+ };
330
+
331
+ ```
332
+
333
+ main は省略しました。

3

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

2020/03/09 06:45

投稿

kazuma-s
kazuma-s

スコア8224

test CHANGED
@@ -115,3 +115,125 @@
115
115
  ```
116
116
 
117
117
  さらに、main の a は、Vector<int> a(20); にします。
118
+
119
+
120
+
121
+ **追記2**
122
+
123
+ main が少しずつ実行できるように作っていきましょう。
124
+
125
+ ```C++
126
+
127
+ #include <iostream>
128
+
129
+ using namespace std;
130
+
131
+
132
+
133
+ template<typename T>
134
+
135
+ class Vector {
136
+
137
+ T* mData;
138
+
139
+ int mSize;
140
+
141
+ int mCapacity;
142
+
143
+
144
+
145
+ public:
146
+
147
+ Vector() {
148
+
149
+ mSize = 0; mCapacity = 15; mData = new T[mCapacity];
150
+
151
+ }
152
+
153
+ ~Vector() { delete[] mData; }
154
+
155
+ void PushBack(const T& tItem) {
156
+
157
+ if (mSize < mCapacity)
158
+
159
+ mData[mSize++] = tItem;
160
+
161
+ else
162
+
163
+ cout << "to be implemented later\n";
164
+
165
+ }
166
+
167
+
168
+
169
+ class Iterator {
170
+
171
+ int mCurrentIndex = 0;
172
+
173
+ T *mMyVector = nullptr; // not a pointer to Vector<T>
174
+
175
+
176
+
177
+ public: // コンストラクタは public に
178
+
179
+ Iterator(T *tWho, int tLocation) { // not a pointer to Vector<T>
180
+
181
+ mMyVector = tWho;
182
+
183
+ mCurrentIndex = tLocation;
184
+
185
+ }
186
+
187
+ T& GetData() { return mMyVector[mCurrentIndex]; }
188
+
189
+ void Next() { mCurrentIndex += 1; }
190
+
191
+ bool IsEqual(const Iterator& rhs) const {
192
+
193
+ return mMyVector == rhs.mMyVector && mCurrentIndex == rhs.mCurrentIndex;
194
+
195
+ }
196
+
197
+ }; // end of class Iterator definition
198
+
199
+
200
+
201
+ Iterator Begin() { return Iterator(mData, 0); }
202
+
203
+ Iterator End() { return Iterator(mData, mSize); }
204
+
205
+ };
206
+
207
+
208
+
209
+ int main()
210
+
211
+ {
212
+
213
+ Vector<int> tTester;
214
+
215
+ tTester.PushBack(0);
216
+
217
+ tTester.PushBack(1);
218
+
219
+ tTester.PushBack(2);
220
+
221
+
222
+
223
+ for (Vector<int>::Iterator iter = tTester.Begin();
224
+
225
+ !iter.IsEqual(tTester.End()); iter.Next()) {
226
+
227
+ cout << iter.GetData() << " ";
228
+
229
+ }
230
+
231
+ cout << endl;
232
+
233
+ }
234
+
235
+ ```
236
+
237
+ IsEqual は Vector のすべての要素が等しいかどうかではなく、
238
+
239
+ Iterator が同じ要素を指しているかどうかを調べるものです。

2

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

2020/03/09 05:28

投稿

kazuma-s
kazuma-s

スコア8224

test CHANGED
@@ -95,3 +95,23 @@
95
95
  ```
96
96
 
97
97
  Vector のコピーコンストラクタや代入演算子の定義は省略しました。
98
+
99
+
100
+
101
+ **追記**
102
+
103
+ 質問のコードの Vector のコンストラクタの 15 は mSize ではなく mCapacity のデフォルト値だったんですね。
104
+
105
+ コンストラクタを次のように修正します。
106
+
107
+ ```C++
108
+
109
+ Vector(int n = 0) : mSize(n), mCapacity(n < 15 ? 15 : n) {
110
+
111
+ mData = new T[mCapacity];
112
+
113
+ }
114
+
115
+ ```
116
+
117
+ さらに、main の a は、Vector<int> a(20); にします。

1

無意味な改行の削除

2020/03/08 16:09

投稿

kazuma-s
kazuma-s

スコア8224

test CHANGED
@@ -70,8 +70,6 @@
70
70
 
71
71
  a[i] = i + 1;
72
72
 
73
- cout << endl;
74
-
75
73
  for (Vector<int>::Iterator it = a.Begin(); it != a.End(); ++it)
76
74
 
77
75
  cout << " " << *it;