Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Общие вопросы > Вопрос по инкапсуляции |
Автор: INHazeR 4.11.2007, 21:07 | ||||||||
Добрый день. Предположим, имеем
Т.е. инициализация поля класса, представляющего собой указатель на массив символов, происходит по указателю, данному пользователем. Я себе представляю это так:
Теперь представим себе такую ситуацию:
Получается по смыслу полная чушь. Мы создали объект класса, инициализировали одно из его полей соответствующей переменной, расположенной по адресу myname. И вместе с тем, имеем неограниченный доступ фактически к частной переменной класса, name. Что и приводит вот к таким плачевным результатам. Напрашивается решение:
Однако это не работает. Даже если бы и работало, появляется вопрос: а что клиенту делать с указателем _name? Удалять вручную после создания объекта класса? В общем, совсем я запутался. Прошу помощи и разъяснений, и пардон если вопрос глупый. ![]() |
Автор: Daevaorn 4.11.2007, 21:12 |
Можно и нужно использовать std::string |
Автор: INHazeR 4.11.2007, 21:16 |
это все здорово, но вопрос остается открытым... |
Автор: Daevaorn 4.11.2007, 21:22 |
это ответ на вопрос и есть. поле класса должно быть std::string. тогда нет проблем с владением, |
Автор: Alek86 4.11.2007, 22:40 |
класс не должен (за редким исключением) содержать указатели на внешние данные, поскольку его данные не должны зависеть от внешнего мира напрямую. это и есть принцип инкапсуляции. потому std::string и подходит идеально. он просто скопирует себу ту твою строку будет хранить созданную копию у себя. а при удалении экземпляра класса Worker, std::string сам удалит копию. |
Автор: Alek86 5.11.2007, 19:23 | ||
жесть зачем этому учить? ![]() пусть лучше пользует уже std::string. ЗЫ.
ЗЗЫ. Почти как рядом в топике у архимеда вышло ![]() |