我尝试实施此处发布的解决方案 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的输出变成英文?。