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

时间:2018-05-21 07:35:38

标签: c++ iterator polymorphism

在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]; };
};

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

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类,使其成为有效的随机访问迭代器?

编辑

数组中的类型不仅仅是intfloat;它可以是Base *Child *,如果数组中的类型为Base,我需要通过ChildIterator访问Base *个成员。

1 个答案:

答案 0 :(得分:0)

您可以简单地使用模板类。请查看我的示例,其中包含大小为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
};