Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.85/13: Рейтинг темы: голосов - 13, средняя оценка - 4.85
1 / 1 / 0
Регистрация: 29.01.2014
Сообщений: 30

Инкапсуляция строк

08.02.2014, 06:47. Показов 2696. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Приветствую!
Как сделать инкапсуляцию строк?
Например:
Допустим, для целых чисел можно использовать:
C++
1
2
3
4
5
6
enum class Colors
{
    RED = 0,
    GREEN = 12,
    BLUE = 23,
};
Данные собраны в одном месте и гарантированно инициализированы.
Дальше не нужно заморачиваться с созданием "магических чисел", а напрямую вызвать например Colors::GREEN.
Но как быть со строками в таком случаи? В класс-перечисление строки не загнать. Как казалось бы вариант, можно сделать ассоциативный контейнер с ключом Colors и элементом std::string.
C++
1
2
3
std::map<Colors, std::string> ColorStrings;
ColorStrings[Colors::RED] = "Red color";
ColorStrings[Colors::BLUE] = "Blue color";
После получать элемент string по ColorStrings[Colors::BLUE]. Но нет же гарантии, что ключ Colors::BLUE находится в этом контейнере. А проверять каждый раз на наличие - вовсе не вариант.

Итак, какой можно найти выход в данной ситуации?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
08.02.2014, 06:47
Ответы с готовыми решениями:

Класс строк, необходима ли инкапсуляция?
Волнует такой вот вопрос, писал класс строк с целью перегрузки операторов, в качестве полей класса: массив char'ов и целочисленный тип,...

инкапсуляция
Возможно ли определение пользовательского типа, чтобы им можно было пользоваться только внутри класса? На например class aaaa { ...

Инкапсуляция.
Написать программу имитирующую работу банковского счета методом инкапсуляции. Программа должна быть сделана в консольном приложении. И...

10
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
08.02.2014, 07:29
Самое простое - завести кучу констант.
0
1 / 1 / 0
Регистрация: 29.01.2014
Сообщений: 30
08.02.2014, 07:42  [ТС]
Цитата Сообщение от valval Посмотреть сообщение
сделать инкапсуляцию
Цитата Сообщение от 0x10 Посмотреть сообщение
завести кучу констант.
, если вы имеете в виду extern/static константы.
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
08.02.2014, 07:48
Как их оформить - не особо принципиально.
Можно разместить все в пространстве имен, можно в класс. Для доступа - либо сделать их открытыми, либо предоставить пачку методов, которые будутт возвращать...

Введение какого-то промежуточного индекса действительно откладывает проверку на наличие строки с этапа компиляции на этап выполнения.

Не совсем ясно что и от кого инкапсулируем и чем плохи константы.
0
1 / 1 / 0
Регистрация: 29.01.2014
Сообщений: 30
08.02.2014, 08:27  [ТС]
Цитата Сообщение от 0x10 Посмотреть сообщение
чем плохи константы.
Я подумал, что вы рекомендовали мне нагадить константными глобальными переменными, типа:
C++
1
static std::string COLOR_RED = "Red color";
или
C++
1
extern const std::string COLOR_RED = "Red color";
---
Насчёт вашего предложения.
Если сделать namespace типа:
C++
1
2
3
4
5
namespace Colors
{
    const std::string Red =  "Red color";
    const std::string Blue = "Blue color";
}
Мы видим нагаженный заголовочный файл.
А если сделать class типа:
C++
1
2
3
4
5
6
7
8
class Colors
{
    static std::string Red;
    static std::string Blue; 
};
 
std::string Colors::Red= "Red color";
std::string Colors::Blue= "Red color";
Пойдет, но не совсем по христианский.
Других вариантов нет?
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
08.02.2014, 08:50
Цитата Сообщение от valval Посмотреть сообщение
Пойдет, но не совсем по христианский.
Почему же? Сделать строки помимо static еще и const - и норм.
0
1 / 1 / 0
Регистрация: 29.01.2014
Сообщений: 30
08.02.2014, 09:06  [ТС]
Цитата Сообщение от 0x10 Посмотреть сообщение
Почему же? Сделать строки помимо static еще и const - и норм.
Основной плюс - обязательная необходимость определения переменных, иначе получаем ошибку линковки.
Просто хотелось бы определить значения внутри класса

Есть ещё вариант
C++
1
2
3
4
5
6
7
8
9
10
11
12
struct Colors
{
    Colors();
    std::string Red;
    std::string Blue; 
} const sColors;
 
Colors::Colors() 
{
    Red = "Red color";
    Blue = "Red color";
}
Что думаете?
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
08.02.2014, 09:19
Лучший ответ Сообщение было отмечено valval как решение

Решение

Цитата Сообщение от valval Посмотреть сообщение
Просто хотелось бы определить значения внутри класса
Как-нибудь так?
C++
1
2
3
4
5
6
#pragma once
 
struct Colors
{
    static constexpr const char* const red = "red color";
};
Но тогда в заголовочном файле будет весь этот мусор, а выше уже было сказано, что этого не хочется. Иначе говоря, "внутри класса" - это где?

Цитата Сообщение от valval Посмотреть сообщение
иначе получаем ошибку линковки.
Это все еще лучше, чем ошибка времени выполнения.

Цитата Сообщение от valval Посмотреть сообщение
Что думаете?
Не вижу выигрыша по сравнению с классом.
Более того, появляется возмодность пользователю самому создавать такие объекты, поскольку конструктор открытый. А нужно ли предоставлять такую возможность? По смыслу кажется, что нет. Т.е. если используем такой подход, то нужно конструктор сделать приватным. Чтобы создать-таки глобальный объект, нужен дружественный фабричный метод, который тоже надо скрыть от пользователя.
Вот и получается, что для решения такой простой задачи куча оверхеда.
1
1 / 1 / 0
Регистрация: 29.01.2014
Сообщений: 30
08.02.2014, 09:26  [ТС]
Цитата Сообщение от 0x10 Посмотреть сообщение
Как-нибудь так?
C++
1
2
3
4
5
6
#pragma once
 
struct Colors
{
    static constexpr const char* const red = "red color";
};
.
Цитата Сообщение от valval Посмотреть сообщение
Мы видим нагаженный заголовочный файл.
--
Цитата Сообщение от 0x10 Посмотреть сообщение
иначе получаем ошибку линковки.
Это все еще лучше, чем ошибка времени выполнения.
Да, это я как раз таки отнес к плюсу.
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
08.02.2014, 10:11
Цитата Сообщение от valval Посмотреть сообщение
Допустим, для целых чисел можно использовать:
Код C++
1
2
3
4
5
6
enum class Colors
{
* * RED = 0,
* * GREEN = 12,
* * BLUE = 23,
};
Данные собраны в одном месте и гарантированно инициализированы.
Данные здесь даже не декларированы.

Добавлено через 16 минут
Цитата Сообщение от valval Посмотреть сообщение
Я подумал, что вы рекомендовали мне нагадить константными глобальными переменными, типа:
Код C++
1
static std::string COLOR_RED = "Red color";
Это переменная.
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
08.02.2014, 11:10
Он так и сказал: "переменными", только в его случае еще и "константными"..
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
08.02.2014, 11:10
Помогаю со студенческими работами здесь

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

Наследование и инкапсуляция в C++
Как осуществляется наследование свойств объектов и инкапсуляция в C++?

wxDev-C++ и инкапсуляция
Всем привет. Учусь по книжке Дейтелов, дошел до классов. Авторы пропагандируют методику сокрытия ненужных данных, то есть делать 3 файла:...

Инкапсуляция. классы
Добрый вечер. История такая: Разбирался с инкапсуляцией классов. Но не могу сформулировать точно, кратко и ёмко как всё происходит. В целом...

инкапсуляция методов
можно ли в С ++ инкапсулировать методы? чтобы один метод был доступен только после вызова другого


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru