-1

それで、私はカスタム イテレータがどのように機能するかを理解しようとしてきました。非常に多くの時間を費やしたにもかかわらず、まだ足りないので、コミュニティ全体に質問することにしました。何が間違っているのでしょうか? 助けてください、説明はいいでしょうが、それが「マイナー」である場合は必要ありません.

副次的な質問として、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;
}
4

1 に答える 1

3

明らかな問題の1つは、operator!=実際に平等をテストすることです。

于 2012-09-24T16:55:44.853 に答える