Как реализовать единый интерфейс итераторов дочерних классов в базовом классе? - PullRequest
0 голосов
/ 21 мая 2018

В 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, чтобы он был действительным итератором произвольного доступа?

EDIT :

Типы в массиве:не просто int или float;это может быть Base * или Child *, и мне нужно получить доступ к Base членам через ChildIterator, если тип в массиве - Base *.

1 Ответ

0 голосов
/ 21 мая 2018

Вы можете просто использовать шаблонный класс для этого.Посмотрите на мой пример для класса с массивом целых чисел размером 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
};
...