それで、私はカスタム イテレータがどのように機能するかを理解しようとしてきました。非常に多くの時間を費やしたにもかかわらず、まだ足りないので、コミュニティ全体に質問することにしました。何が間違っているのでしょうか? 助けてください、説明はいいでしょうが、それが「マイナー」である場合は必要ありません.
副次的な質問として、MSVS のクラス ダイアグラムで「コレクション アソシエーションとして表示」を機能させるための要件を知っている人はいますか? C ++では機能しませんか?私の bar2 でさえ、それに関する限り int のコレクションではありません。
これが私のコードです。コンパイルする必要がありますが、明らかにイテレータが壊れています...
編集:人々が尋ねているので、問題は私が実装したイテレータがバーを反復処理しないことです
#include <vector>
#include <iostream>
using namespace std;
template<class T>
class Foo
{
public:
template<class T>
class FooIterator : std::iterator<std::forward_iterator_tag, T, ptrdiff_t, T*, T&>
{
public:
Foo<T>* arrayPtr;
int index, size;
FooIterator(Foo<T>* arrayPtr, int size, int index) : arrayPtr(arrayPtr), size(size), index(index) {}
T& operator*() {return *(arrayPtr->operator[](index));}
T* operator->() {return &(operator*());}
FooIterator &operator++(){++index; return *this;}
FooIterator operator++(int){FooIterator tmp(*this); ++(*this); return tmp;}
bool operator!=(const FooIterator &other) const {return other.index == index;}
};
T** ts;
int size;
int index;
typedef FooIterator<T> fooiterator;
fooiterator begin(){return fooiterator(this, size, 0);}
fooiterator end(){return fooiterator(this, size, size);}
~Foo();
void init(int size);
void insert(T* item);
T* operator[](int index);
typedef T value_type;
typedef T* pointer;
typedef const T* const_pointer;
typedef T& reference;
typedef const T& const_reference;
typedef int size_type;
typedef ptrdiff_t difference_type;
};
template<class T>
void Foo<T>::init(int size)
{
ts = new T*[size];
index = 0;
}
template<class T>
Foo<T>::~Foo()
{
for(int i = 0; i < index; i++)
delete ts[i];
delete ts;
}
template<class T>
void Foo<T>::insert(T* item)
{
ts[index++] = item;
}
template<class T>
T* Foo<T>::operator[](int index)
{
return ts[index];
}
struct Bar
{
public:
Foo<int> nums;
Bar()
{
nums.init(3);
int val = 1;
nums.insert(new int(1));
nums.insert(new int(2));
nums.insert(new int(3));
for each (int var in nums)
{
cout << var << endl;
}
}
};
struct Bar2
{
vector<int> nums;
Bar2()
{
nums.push_back(4);
nums.push_back(5);
nums.push_back(6);
for each (int var in nums)
{
cout << var << endl;
}
}
};
int main ()
{
Bar bar;
/*for (int i = 0; i < bar.nums.index; i++)
{
cout << *bar.nums[i] << endl;
}*/
Bar2 bar2;
cin.get();
return 0;
}