C ++: разработка интерфейса класса, содержащего много контейнеров - PullRequest
2 голосов
/ 06 декабря 2010

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

class Foo
{
  public:
    typedef std::vector<int> int_list;
    typedef std::vector<X> x_list;

    // It would be nice if the user could iterate through these etc. so that I
    // could define functions that operate on them as non-member non-friends.

    typedef int_list::size_type int_list_size_type;
    typedef int_list::const_iterator int_list_const_iter;

    typedef x_list::size_type x_list_size_type;
    typedef x_list::const_iterator x_list_const_iter;

    int_list_const_iter int_list begin() const { return ints_.begin(); }
    x_list_const_iter begin() const { return xs_.begin(); }

    int_list::size_type size_of_ints() const { return ints_.size(); }
    x_list::size_type size_of_xs() const { return xs_.size(); }

    // And so forth ... !

  private:
    int_list ints_;
    x_list xs_;
};

Как-то мне неловко.Это умный способ делать то, что я делаю?По сути, для каждого контейнера мне понадобятся typedefs и (const overload) методы begin и end и т. Д. Мне интересно: как бы вы разработали интерфейс, назвав typedefs и т. Д.?Я думаю, что я в основном беспокоюсь об интерфейсе и взрыве методов, и это выглядит довольно уродливо.

Может быть, одним из способов ограничения числа методов начала / конца был бы подход на основе шаблонов с использованием somekindтегов, но я не уверен, разумно ли это.

Спасибо!

Ответы [ 3 ]

4 голосов
/ 06 декабря 2010

Похоже, ваш класс делает слишком много. Если вашим клиентам необходимо выполнять все эти виды операций с этими контейнерами, вероятно, лучше, если вы просто предоставите постоянную ссылку на сам контейнер, а не пытаетесь обернуть каждый интерфейс STL самостоятельно.

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

0 голосов
/ 06 декабря 2010

Вы не должны разрешать доступ к контейнерам. Вы должны экспортировать функциональность класса, и класс должен иметь центральную точку. Предполагая, что класс использует контейнеры, например, int - это ключ, который ссылается на X, вам, вероятно, понадобится интерфейс, который координирует доступ. В этом случае вам не следует предоставлять доступ к базовым контейнерам.

0 голосов
/ 06 декабря 2010

Вы действительно пробовали это? Ваш код не скомпилируется. У вас не может быть двух функций с одинаковым списком имен / параметров, которые возвращают разные вещи.

Что касается намерения ... ваши опасения уместны, и ваш класс, вероятно, недостаточно выполняет свою собственную работу, чтобы оправдать свое существование. Тот факт, что вы хотите раскрыть все внутреннее содержимое объекта, чтобы клиенты могли над ним работать, заставляет меня заключить, что ваш класс почти наверняка на 100% бесполезен. Это проблема дизайна, и ваши опасения - это просто ваш нос, говорящий вам, что что-то воняет.

...