C ++: заставить собственный класс работать как контейнерный и обычный класс? - PullRequest
1 голос
/ 24 февраля 2011

Я хочу иметь некоторую myObject, которая будет хранить коллекцию (векторную) SomeOtherObjects (то есть, будучи однородной, верно?), Которая должна быть повторяемой и доступной через (myObject[i]).SomeOtherObjectField1, но также будет иметь нормальный такие члены, как myObject.doStuff() и myObject.Stuff.

Есть ли возможность реализовать такой класс, или использование private std :: vector для сохранения объектов (которых я пытаюсь избежать - не люблю private std :: container) будет умнее?

Ответы [ 4 ]

1 голос
/ 24 февраля 2011

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

my2c

1 голос
/ 24 февраля 2011

Предпочитайте композицию наследованию, если ваша цель - повторное использование кода. (Наследование должно использоваться для включения полиморфизма, который в данном случае не является проблемой.)

0 голосов
/ 24 февраля 2011

Часто правильный подход к структуре заключается в уточнении семантики. Вам нужно задать такие вопросы, как Msgstr "Является ли myObject вектором <>?" Ответ, вероятно, нет. Если вы затем следуете принципу, что класс делает одно (сплоченность), то из этого следует, что синтаксический сахар вокруг вектора <>, вероятно, не так хорош.

Из этого следует, что vector<> является частным участником. Нет проблем с возвратом константной ссылки на него. Возврат неконстантной ссылки нарушил бы инкапсуляцию - это также могут быть публичные данные

Если вы хотите:

(myObject[i]).SomeOtherObjectMethod1();

тогда это достаточно просто реализовать через operator[](unsigned index). Я подозреваю, что если вы действительно хотите, чтобы вам было лучше быть последовательным и рассматривать myObject как отдельный контейнер. Это означает, что не нужно предоставлять метод доступа const ref для vector<> и реализовывать специальные методы доступа, которые вам действительно нужны. Это значительно облегчит понимание клиентского кода.

0 голосов
/ 24 февраля 2011

Я бы использовал private std::vector<> и встроенный метод для возврата константной ссылки на него.Почему вам не нравятся стандартные членские контейнеры?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...