Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
valval
1 / 1 / 0
Регистрация: 29.01.2014
Сообщений: 30
08.02.2014, 06:47     Инкапсуляция строк #1
Приветствую!
Как сделать инкапсуляцию строк?
Например:
Допустим, для целых чисел можно использовать:
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 находится в этом контейнере. А проверять каждый раз на наличие - вовсе не вариант.

Итак, какой можно найти выход в данной ситуации?
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.02.2014, 06:47     Инкапсуляция строк
Посмотрите здесь:

Инкапсуляция. C++
C++ Инкапсуляция в ООП и C++
C++ инкапсуляция
C++ wxDev-C++ и инкапсуляция
C++ инкапсуляция, ссылка на функцию
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
08.02.2014, 07:29     Инкапсуляция строк #2
Самое простое - завести кучу констант.
valval
1 / 1 / 0
Регистрация: 29.01.2014
Сообщений: 30
08.02.2014, 07:42  [ТС]     Инкапсуляция строк #3
Цитата Сообщение от valval Посмотреть сообщение
сделать инкапсуляцию
Цитата Сообщение от 0x10 Посмотреть сообщение
завести кучу констант.
, если вы имеете в виду extern/static константы.
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
08.02.2014, 07:48     Инкапсуляция строк #4
Как их оформить - не особо принципиально.
Можно разместить все в пространстве имен, можно в класс. Для доступа - либо сделать их открытыми, либо предоставить пачку методов, которые будутт возвращать...

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

Не совсем ясно что и от кого инкапсулируем и чем плохи константы.
valval
1 / 1 / 0
Регистрация: 29.01.2014
Сообщений: 30
08.02.2014, 08:27  [ТС]     Инкапсуляция строк #5
Цитата Сообщение от 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";
Пойдет, но не совсем по христианский.
Других вариантов нет?
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
08.02.2014, 08:50     Инкапсуляция строк #6
Цитата Сообщение от valval Посмотреть сообщение
Пойдет, но не совсем по христианский.
Почему же? Сделать строки помимо static еще и const - и норм.
valval
1 / 1 / 0
Регистрация: 29.01.2014
Сообщений: 30
08.02.2014, 09:06  [ТС]     Инкапсуляция строк #7
Цитата Сообщение от 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";
}
Что думаете?
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
08.02.2014, 09:19     Инкапсуляция строк #8
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от valval Посмотреть сообщение
Просто хотелось бы определить значения внутри класса
Как-нибудь так?
C++
1
2
3
4
5
6
#pragma once
 
struct Colors
{
    static constexpr const char* const red = "red color";
};
Но тогда в заголовочном файле будет весь этот мусор, а выше уже было сказано, что этого не хочется. Иначе говоря, "внутри класса" - это где?

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

Цитата Сообщение от valval Посмотреть сообщение
Что думаете?
Не вижу выигрыша по сравнению с классом.
Более того, появляется возмодность пользователю самому создавать такие объекты, поскольку конструктор открытый. А нужно ли предоставлять такую возможность? По смыслу кажется, что нет. Т.е. если используем такой подход, то нужно конструктор сделать приватным. Чтобы создать-таки глобальный объект, нужен дружественный фабричный метод, который тоже надо скрыть от пользователя.
Вот и получается, что для решения такой простой задачи куча оверхеда.
valval
1 / 1 / 0
Регистрация: 29.01.2014
Сообщений: 30
08.02.2014, 09:26  [ТС]     Инкапсуляция строк #9
Цитата Сообщение от 0x10 Посмотреть сообщение
Как-нибудь так?
C++
1
2
3
4
5
6
#pragma once
 
struct Colors
{
    static constexpr const char* const red = "red color";
};
.
Цитата Сообщение от valval Посмотреть сообщение
Мы видим нагаженный заголовочный файл.
--
Цитата Сообщение от 0x10 Посмотреть сообщение
иначе получаем ошибку линковки.
Это все еще лучше, чем ошибка времени выполнения.
Да, это я как раз таки отнес к плюсу.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
08.02.2014, 10:11     Инкапсуляция строк #10
Цитата Сообщение от 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";
Это переменная.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.02.2014, 11:10     Инкапсуляция строк
Еще ссылки по теме:

Класс строк, необходима ли инкапсуляция? C++
C++ Инкапсуляция. классы
C++ Наследование и инкапсуляция в C++

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

Или воспользуйтесь поиском по форуму:
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
08.02.2014, 11:10     Инкапсуляция строк #11
Он так и сказал: "переменными", только в его случае еще и "константными"..
Yandex
Объявления
08.02.2014, 11:10     Инкапсуляция строк
Ответ Создать тему
Опции темы

Текущее время: 09:06. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru