Лучший интерфейс для класса, который скрывает контейнер - PullRequest
1 голос
/ 20 сентября 2011

У меня есть MyClass, который скрывает контейнер внутри него, я хочу контролировать, когда новый элемент добавляется в контейнер и когда элемент должен быть удален из контейнера, но мне не нужно контролировать операцию только для чтениянапример, функция получения

class MyClass {
    protected: 
        std::vector<MySubClass> subclasses;
    public:
}

для взаимодействия с пользователем MyClass, если я реализую функцию интерфейса, такую ​​как:

addSubClass(), getSubClassAt(int ), getSubClassIndex(MySubclass ), delSubClass().

или его лучше просто вернуть константный итератор для операции только для чтения:

std::vector<MySubClass>::const_iterator getSubclassIterator();

и предоставить специальную функцию операции записи, такую ​​как

addSubClass(), delSubClass().

или есть лучший способ чем эти?

Ответы [ 2 ]

1 голос
/ 20 сентября 2011

Если вы придумаете свои собственные функции-члены для управления внутренним списком объектов, тогда мне придется изучить ваш интерфейс, когда я захочу использовать ваш класс.

Я предпочитаю использовать условные обозначения стандартной библиотеки, которые я уже знаю, поэтому я могу сразу использовать ваш класс:

class MyClass {
    protected: 
        std::vector<MySubClass> subclasses;
    public:
        typedef std::vector<MySubClass>::const_iterator const_iterator;

        const_iterator begin() const {return subClasses.begin();}
        const_iterator end  () const {return subClasses.end  ();}

        void insert(const_iterator where, const MySubClass& obj);
        iterator erase(iterator pos);
        iterator erase(iterator begin, iterator end);

        // ...
}
1 голос
/ 20 сентября 2011

Ваши пользователи по достоинству оценят, если вы предоставите подмножество вызовов контейнера стандартной библиотеки, которые применяются к вашему контейнеру: например, push_back, begin, end и find. Если вы заново изобрели интерфейс, клиентам будет сложнее понять его, и он не всегда будет совместим со стандартными алгоритмами.

...