Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
valval
1 / 1 / 0
Регистрация: 29.01.2014
Сообщений: 30
#1

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

08.02.2014, 06:47. Просмотров 435. Ответов 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)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.02.2014, 06:47
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Инкапсуляция строк (C++):

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

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

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

Инкапсуляция в ООП и C++ - C++
Вы используете в классе геттеры и сеттеры (функции). Отделяйте спецификацию от реализации (инкапсуция в каком-то роде). Т.е. header file...

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

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

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

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

Не совсем ясно что и от кого инкапсулируем и чем плохи константы.
0
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";
Пойдет, но не совсем по христианский.
Других вариантов нет?
0
0x10
2479 / 1652 / 248
Регистрация: 24.11.2012
Сообщений: 4,093
08.02.2014, 08:50 #6
Цитата Сообщение от valval Посмотреть сообщение
Пойдет, но не совсем по христианский.
Почему же? Сделать строки помимо static еще и const - и норм.
0
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";
}
Что думаете?
0
0x10
2479 / 1652 / 248
Регистрация: 24.11.2012
Сообщений: 4,093
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 Посмотреть сообщение
Что думаете?
Не вижу выигрыша по сравнению с классом.
Более того, появляется возмодность пользователю самому создавать такие объекты, поскольку конструктор открытый. А нужно ли предоставлять такую возможность? По смыслу кажется, что нет. Т.е. если используем такой подход, то нужно конструктор сделать приватным. Чтобы создать-таки глобальный объект, нужен дружественный фабричный метод, который тоже надо скрыть от пользователя.
Вот и получается, что для решения такой простой задачи куча оверхеда.
1
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 Посмотреть сообщение
иначе получаем ошибку линковки.
Это все еще лучше, чем ошибка времени выполнения.
Да, это я как раз таки отнес к плюсу.
0
taras atavin
3570 / 1753 / 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";
Это переменная.
0
castaway
Эксперт С++
4915 / 3023 / 370
Регистрация: 10.11.2010
Сообщений: 11,080
Записей в блоге: 10
Завершенные тесты: 1
08.02.2014, 11:10 #11
Он так и сказал: "переменными", только в его случае еще и "константными"..
1
08.02.2014, 11:10
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.02.2014, 11:10
Привет! Вот еще темы с ответами:

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

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

Инкапсуляция, ссылка на функцию - C++
Делаю задание по инкапсуляции, реализовать 3 вида списков в 1 программе, причем списки как подкл модули и снаружи только выбор типа при...

Инкапсуляция. Создание класса - C++
Задана дата начала занятий. Для даты внутри семестра определить, является ли текущая учебная неделя верхней или нижней и посчитать ее...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru