我的任务是编写自己的容器Linked_list
和Array_list
。我有一个界面:
typedef int value_type;
class Container
{
public:
class Iterator
{
public:
Iterator();
Iterator(value_type* other);
Iterator(const Iterator& other);
Iterator& operator=(const Iterator& other);
...
};
Container();
Container(const Container& other);
~Container();
virtual value_type& front() const=0;
virtual value_type& back() const=0;
virtual Iterator begin() const=0; //
...
};
我做了派生类Linked_list和Array_list:
class Linked_list:public Container
{
public:
long int cur_size;
List elem;
static Link end_;
class Iterator: public Container::Iterator
{
friend Linked_list;
Link *p;
};
Iterator begin() const; //overriding virtual function return type differs ...
...
}
我认为这都是错的。嵌套类Linked_list::Iterator
应该是派生类吗?
如果我无法更改界面,是否可以这样做?
答案 0 :(得分:9)
考虑到你的设计约束你不能使用模板,一件事应该改变:添加接口IteratorImpl
。因此,您可以从基础class Iterator
非虚拟中设置class Container
。它必须是非虚拟的,因为类似STL的迭代器应具有值语义。有关详细信息,请参阅pimpl idiom!
像这样:
typedef int value_type;
class Container
{
protected:
class IteratorImpl
{
public:
virtual void next() = 0;
virtual IteratorImpl* clone() const = 0;
virtual value_type get() const = 0;
virtual bool isEqual(const IteratorImpl& other) const = 0;
};
public:
class Iterator
{
public:
Iterator(IteratorImpl* impl) : impl(impl) {}
~Iterator() { delete impl; }
Iterator(const Iterator& other) : impl(other.impl->clone()) {}
Iterator& operator=(const Iterator& other) {
IteratorImpl* oldImpl = impl;
impl = other.impl->clone();
delete oldImpl;
}
bool operator == (const Iterator& other) const
{
return impl->isEqual(*other->impl);
}
Iterator& operator ++ ()
{
impl->next();
return *this;
}
value_type& operator*() const
{
return impl->get();
}
value_type* operator->() const
{
return &impl->get();
}
};
Container();
Container(const Container& other);
~Container();
virtual value_type& front() const=0;
virtual value_type& back() const=0;
virtual Iterator begin() const=0; //
...
};
然后在你的派生中实现IteratorImpl:
class Linked_list:public Container
{
protected:
class IteratorImpl: public Container::IteratorImpl
{
....
};
public:
Iterator begin() const { return new IteratorImpl(firstNode); }
Iterator end() const { return new IteratorImpl(nodeAfterLastNode); }
...
};
这些firstNode和nodeAfterLastNode只是我的猜测 - 使用你需要的任何东西来实现IteratorImpl接口......
答案 1 :(得分:0)
您应该定义一个const_value_type来表示const value_type,并将其用作前后虚拟方法的返回值。或者你可以在这些方法上删除const限定符,因为在const方法上使用非const引用返回类型是没有意义的。
如果没有关于课程的更多细节,其余部分很难说清楚。 您还可以看一下STL的早期实现:这是了解这些主题的一种非常好的方法。