C ++中抽象Container类中的嵌套迭代器

时间:2015-07-09 09:32:47

标签: c++ inheritance iterator

我尝试实施此处发布的解决方案 c++ abstract class with nested class. derived class and nested class 作者:PiotrNycz。我的标题如下所示: 摘要类:


    #ifndef MBRINGQUEUE
    #define MBRINGQUEUE

    class MBRingQueue {
    protected:
        class IteratorImpl
        {
        public:
            virtual void next() = 0;
            virtual IteratorImpl* clone() const = 0;
            virtual int get() = 0;
            virtual bool isEqual(const IteratorImpl& other) const = 0;      
        };

    public:
        class const_iterator 
        {
        public:
            const_iterator(IteratorImpl* impl, const MBRingQueue* rq) : impl(impl) {} 
            const_iterator(IteratorImpl* impl, const MBRingQueue* rq, bool is_end) : impl(impl) {}
            ~const_iterator() {delete impl;}

            const_iterator(const const_iterator& other) : impl(other.impl->clone()) {}

            const_iterator& operator=(const const_iterator& other) {
                IteratorImpl* oldImpl = impl;
                impl = other.impl->clone();
                delete oldImpl;
            }       

            bool operator==(const const_iterator& rv) const
            {
                return impl->isEqual(*rv.impl);
            }

            bool operator!=(const const_iterator& rv) const
            {
                return !(impl->isEqual(*rv.impl));
            }

            const_iterator& operator++()
            {
                impl->next();
                return *this;
            }

            IteratorImpl* impl;
            int left;
        };

        MBRingQueue(int size);
        virtual ~MBRingQueue() {};
        virtual const_iterator begin() const=0;
        virtual const_iterator end() const=0;
    };

    #endif

以及从中继承的类:

<pre>
#ifndef RINGQUEUE
#define RINGQUEUE

#include "MBRingQueue.h"

class RingQueue : public MBRingQueue {

protected:
    class IteratorImpl: public MBRingQueue::IteratorImpl
    {
        IteratorImpl(const RingQueue* rq);

        bool isEqual(const MBRingQueue::IteratorImpl& other) const;
        void next();
        int get();
        MBRingQueue::IteratorImpl* clone();

        const RingQueue* _rq;
        bool ring_full;
        int pos;
        int count;
    };

public:
    friend class const_iterator;

    RingQueue(int size);
    ~RingQueue();

    void push_back(int val);
    int pop_front();

    void printQueue();

    const_iterator begin() const;
    const_iterator end() const;

private:
    int _N;
    int _act_size;
    int _start;
    int _end;
    int* _elems;;

};

#endif

当我现在尝试实现例程时:


    RingQueue::const_iterator RingQueue::begin() const {
        return new IteratorImpl(this);

}

我收到错误:

  

1&GT; RingQueue.cpp 1&gt; c:\ users \ michael \ documents \ visual studio   2012 \项目\ project_carbos \ owniterator \ owniterator \ ringqueue.cpp(64):   错误C2259:'RingQueue :: IteratorImpl':Instanz von abstrakter Klasse   kann nicht erstellt werden 1&gt; aufgrund folgender会员:1&gt;
  “MBRingQueue :: IteratorImpl * MBRingQueue :: IteratorImpl :: clone(void)   const“:ist abstrakt 1&gt; c:\ users \ michael \ documents \ visual   工作室   2012 \项目\ project_carbos \ owniterator \ owniterator \ mbringqueue.h(10):   Siehe Deklaration von'MBRingQueue :: IteratorImpl :: clone'   1&gt; c:\ users \ michael \ documents \ visual studio   2012 \项目\ project_carbos \ owniterator \ owniterator \ ringqueue.cpp(64):   错误C2248:“RingQueue :: IteratorImpl :: IteratorImpl”:Kein Zugriff auf   私人会员,dessen Deklaration in der   RingQueue :: IteratorImpl-Klasse erfolgte。 1 GT;
  c:\ users \ michael \ documents \ visual studio   2012 \项目\ project_carbos \ owniterator \ owniterator \ ringqueue.h(11):   Siehe Deklaration von'RingQueue :: IteratorImpl :: IteratorImpl'1&gt;
  c:\ users \ michael \ documents \ visual studio   2012 \项目\ project_carbos \ owniterator \ owniterator \ ringqueue.h(9):   Siehe Deklaration von'RingQueue :: IteratorImpl'   1&gt; c:\ users \ michael \ documents \ visual studio   2012 \项目\ project_carbos \ owniterator \ owniterator \ ringqueue.cpp(64):   错误C2664:'MBRingQueue :: const_iterator :: const_iterator(const   MBRingQueue :: const_iterator&amp;)':Konvertierung des Parameters 1 von   'const MBRingQueue :: const_iterator&amp;'中的'RingQueue :: IteratorImpl *'   nichtmöglich1&gt; Ursache:Konvertierung von   'const MBRingQueue :: const_iterator'中的'RingQueue :: IteratorImpl *'   nichtmöglich1&gt; Quelltyp konnte von keinem Konstruktor   angenommen werden,oderdieÜberladungsauflösungdesKonstruktors ist   mehrdeutig

来自编译器(VS2012)。对不起,这是德语。有没有办法把VS的输出变成英文?。

0 个答案:

没有答案