C 带有嵌套类的抽象类.派生的类和嵌套类

c++ abstract class with nested class. derived class and nested class

本文关键字:嵌套 派生 抽象类      更新时间:2023-10-16

我有编写自己的容器Linked_listArray_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应该是派生类吗?如果我不能更改接口,是否可以这样做?

考虑到您无法使用模板的设计约束,而不是一件事要更改:添加接口IteratorImpl。因此,您可以从基本class Container 非虚拟中制作class Iterator。它需要是非虚拟的,因为STL类迭代器应具有 value语义。有关更多详细信息,请参见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和nodeatterlastnode只是我的猜测 - 使用您需要实现iteratorImpl接口...

您应该定义一个const_value_type表示const value_type,并将其用于前后虚拟方法的返回值。另外,您可以在这些方法上删除const限定符,因为在const方法上具有非const参考返回类型是没有意义的。

没有课程的更多详细信息,其余的很难分辨。您还可以查看STL的早期实现:这是对这些主题进行一些见解的一个很好的方法。