代码之家  ›  专栏  ›  技术社区  ›  Leedehai

如何在基类中实现子类迭代器的统一接口?

  •  4
  • Leedehai  · 技术社区  · 6 年前

    在C++中,假设我有基类 Base ,并且许多子类都是从它派生的。每个子类都包含一个类型和长度的数组。

    class Base {
        //...
        int baseData;
        virtual ChildIterator getBegin();
        virtual ChildIterator getEnd();
    };
    class Child1 : public Base {
        // ...
        static const size_t CAPACITY = 5;
        int ints[CAPACITY];
        ChildIterator getBegin() { return &ints[0]; }
        ChildIterator getEnd() { return &ints[CAPACITY]; };
    };
    class Child2 : public Base {
        // ...
        static const size_t CAPACITY = 7;
        float floats[CAPACITY];
        ChildIterator getBegin() { return &floats[0]; }
        ChildIterator getEnd() { return &floats[CAPACITY]; };
    };
    

    现在,我想让每个子类都是iterable,这意味着,我可以迭代每个子对象的数组成员,如:

    Base *p1 = new Child1(...);
    Base *p2 = new Child2(...);
    
    sort(p1->getBegin(), p1->getEnd());
    // same as: sort(&((Child1)p1->ints[0]), &((Child1)p1->ints[5]));
    
    sort(p2->getBegin(), p2->getBegin() + 3);
    // same as: sort(&((Child2)p2->floats[0]), &((Child2)p2->floats[3]));
    
    
    
    // Please note that sort() is not my intended operation on them;
    // I just use it as an example because it involves iterators. I know
    // I could just define sort() method in each child class.
    

    我应该如何实施 ChildIterator 类以便它是有效的随机访问迭代器?

    编辑 :

    int float 可能是的 Base * Child * ,我需要进入 的成员通过 子迭代器 如果数组中的类型是 .

    1 回复  |  直到 6 年前
        1
  •  0
  •   Marcin    6 年前

    您可以简单地使用模板类。请看我的示例,该类包含大小为5的整数数组。

    class Base
    {
       // Dummy
    };
    
    template<typename TArray, int size>
    class Container : public Base
    {
    public:
        TArray* getBegin()
        {
           return elements;
        }
    
        TArray* getEnd()
        {
           return elements + size;
        }
    
    private:
        TArray elements[size];
    };
    
    class Child : public Container<int, 5>
    {
        // Some Child class specific implementation
    };