

初めまして。  
初めて質問させていただきます。

私は現在、C++でSTLを用いずにポインタを用いた双方向リストを自作する事に取り組んでいます。  
そんななか、とりあえず最後尾に要素を追加する所までは書いたのですが、それをfor文で回そうとしても飛ばされてしまいます(処理されない)。

ブレークポイントを用いて何が原因なのか突き止めようともしたのですが、NULLになっているわけでもなく、結局力及ばず解決には至っていません。

C++の経験が浅く、ポインタに関してどこか見落としているのかもしれないのですが、どなたかご教授をお願いいたします。

BidirectionalList.h

[code]

    //双方向リストクラス
    template <typename T>
    class BidirectionalList
    {
    public:
        BidirectionalList();
        T* begin();
        T* end();
        void push_back(T pushData);
    private:
        template <typename T>
        //各要素の構造体
        struct ListItem
        {
            T* data;
            ListItem* prev;
            ListItem* next;
            ListItem() :
                data(nullptr),
                prev(nullptr),
                next(nullptr){}
            ListItem(T* newData) :
                data(newData),
                prev(nullptr),
                next(nullptr) {}
        };
        ListItem<T>* head;
        ListItem<T>* tail;
        ListItem<T>* nowItem;
    };
    
[/code]

BidirectionalList.cpp

[code]

    template <typename T>
    BidirectionalList<T>::BidirectionalList():
        head(new ListItem<T>()),
        tail(new ListItem<T>()),
        nowItem(head)
    {}
    
    template <typename T>
    void BidirectionalList<T>::push_back(T pushData)
    {
        ListItem<T> *newItem = new ListItem<T>(&pushData);
        nowItem->next = newItem;
        newItem->prev = nowItem;
        newItem->next = tail;
        tail->prev = newItem;
        nowItem = newItem;
    }
    
    template <typename T>
    T* BidirectionalList<T>::begin()
    {
        ListItem<T> *item = nowItem;
        while (item->prev != head)
        {
            item = item->prev;
        }
        return item->data;
    }
    template <typename T>
    T* BidirectionalList<T>::end()
    {
        ListItem<T> *item = nowItem;
        while (item->next != tail)
        {
            item = item->next;
        }
        return item->data;
    }
    
[/code]

使用時

[code]

    BidirectionalList<IHoge*> objList;
    //IHogeを継承したクラスをnew
    objList.push_back(new HogeA());
    objList.push_back(new HogeB());
    objList.push_back(new HogeC());
    objList.push_back(new HogeD());
    for (IHoge* obj : objList)
    {
        //呼ばれない
        obj->HogeFunc();
    }
    
[/code]


CC BY-SA 3.0
2017-02-13T21:37:00.017
32645
2017-02-14T01:05:26.480
2017-02-14T01:05:26.480
76
20642
question
c++ ポインタ stl
自作双方向リストを用いたfor文が回らない原因


>
[code]

>     for (IHoge* obj : objList)
>     {
>         //呼ばれない
>         obj->HogeFunc();
>     }
>  
[/code]

Range-based forを使う前に従来型のforで記述すれば矛盾点に気づくかもしれません。

[code]

    for (IHoge* obj = objList.begin(); obj != objList.end(); ++obj) {
        obj->HogeFunc();
    }
    
[/code]

何が問題かというと`++obj`とされてしまう点です。インクリメントされるのは`ListItem`ではなく、格納している`T*`です。  
STLでも生のポインターを返すのではなくイテレーターを返すのもここに理由があります。

* * *

実用的な双方向リストを実現するためには、操作中に作成した`ListItem`や受け取った`T*`の解放処理についても検討する必要があります。


CC BY-SA 3.0
2017-02-13T23:07:41.447
32646
2017-02-13T23:07:41.447
4236
32645
answer