Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.12.2013, 18:39   #1
Базиля
Участник клуба
 
Аватар для Базиля
 
Регистрация: 03.12.2009
Сообщений: 1,013
Смущение Статический член класса С++

Всем добрый вечер!

Извините, такой вопрос назрел.

Имеем 2 класса, оба используют одинаковые строковые константы в таком виде:

В 1 классе:
Цитата:
str = "один";
И во 2-ом классе:
Код:
if ( str == "один" ) {
    ;
}
Это просто лишь пример, пытаюсь изложить суть самого вопроса

Проблема вопроса - эти две строковые константы связаны между собой по смыслу.
Т.е. в классе 1 строковая константа "один" несет в себе тот же смысл, что и строковая константа "один" в классе 2.

Предположим что в дальнейшем я захочу изменить представление этой константы на "Два", заместо "Один", но очень хочется избежать той ситуации, когда придется бегать по всему коду и исправлять старое значение на новое.

Подскажите, пожалуйста, корректным ли будет разрешение данной ситуации с помощью определения статического члена класса?

В итоге получим:

В 1 классе:
Цитата:
str = Class1::Value;
И во 2-ом классе:
Код:
if ( str == Class1::Value ) {
    ;
}
Если с магическими числами в подобных ситуациях проблем никаких нет - берем и описываем перечисление, то вот что делать со строковыми константами в данной ситуации, и как лучше поступить, ума не приложу

Спасибо!

Последний раз редактировалось Базиля; 19.12.2013 в 18:43.
Базиля вне форума Ответить с цитированием
Старый 19.12.2013, 21:16   #2
Son Of Pain
Участник клуба
 
Регистрация: 23.12.2010
Сообщений: 1,129
По умолчанию

Надо помнить про то, что порядок создания статических объектов в разных единицах компиляции не определен стандартом. Потому лучше сделать статический метод, который вернет эту строку.
Son Of Pain вне форума Ответить с цитированием
Старый 19.12.2013, 21:30   #3
Базиля
Участник клуба
 
Аватар для Базиля
 
Регистрация: 03.12.2009
Сообщений: 1,013
По умолчанию

Son Of Pain
Спасибо!

Цитата:
Надо помнить про то, что порядок создания статических объектов в разных единицах компиляции не определен стандартом.
Можно немного пояснений, не совсем понятно, какие могут возникнуть с этим проблемы?
Ведь инициализация статических членов происходит на стадии компиляции (я сейчас именно про классы) .
Тогда что есть " порядок создания статических объектов в разных единицах компиляции не определен стандартом"?
Поясните, пожалуйста.

Цитата:
Потому лучше сделать статический метод, который вернет эту строку.
Это наилучший выход из сложившейся ситуации?
Или есть более предпочтительный способ?
Базиля вне форума Ответить с цитированием
Старый 19.12.2013, 21:49   #4
Son Of Pain
Участник клуба
 
Регистрация: 23.12.2010
Сообщений: 1,129
По умолчанию

Если строковое поле будет типа std::string, например - это уже объект. Порядок создания таких объектов определен только в рамках одной единицы компиляции. Но об этом можно забыть, и обратиться к нему из инициализатора или конструктора статического объекта в другой единице компиляции. Чтобы избежать потенциальных граблей в этом случае и объявляют метод, возвращающий нужный объект.
Son Of Pain вне форума Ответить с цитированием
Старый 19.12.2013, 22:11   #5
Базиля
Участник клуба
 
Аватар для Базиля
 
Регистрация: 03.12.2009
Сообщений: 1,013
По умолчанию

А какие проблемы при этом могут возникнуть?
Ошибка компиляции?
Компилятор не сможет объединить эти единицы в одно целое?

Просто в первые про такой нюанс слышу, в книгах не встречал информации об этом.
Базиля вне форума Ответить с цитированием
Старый 19.12.2013, 22:20   #6
Son Of Pain
Участник клуба
 
Регистрация: 23.12.2010
Сообщений: 1,129
По умолчанию

Компилятор не выдаст ошибку, в том-то и беда. В хороших книгах пишут об этом, в частности в обсуждениях реализации синглтонов на С++.
Son Of Pain вне форума Ответить с цитированием
Старый 19.12.2013, 22:25   #7
Базиля
Участник клуба
 
Аватар для Базиля
 
Регистрация: 03.12.2009
Сообщений: 1,013
По умолчанию

Son Of Pain
А в какой из книг, к примеру, это описывается?

Цитата:
Компилятор не выдаст ошибку
А с чем тогда ошибка связана то будет?
Если память под объект выделилась, с чем тогда сложности возникнуть могут.

Последний раз редактировалось Базиля; 19.12.2013 в 22:31.
Базиля вне форума Ответить с цитированием
Старый 19.12.2013, 23:01   #8
Son Of Pain
Участник клуба
 
Регистрация: 23.12.2010
Сообщений: 1,129
По умолчанию

У Мейерса в effective c++, например.
Память выделена, но объект в ней еще не проинициализирован.
Son Of Pain вне форума Ответить с цитированием
Старый 20.12.2013, 01:57   #9
Базиля
Участник клуба
 
Аватар для Базиля
 
Регистрация: 03.12.2009
Сообщений: 1,013
По умолчанию

Благодарю!
Все никак мне не ознакомиться с его книгами , а тут и повод появился
Базиля вне форума Ответить с цитированием
Старый 20.12.2013, 12:31   #10
Helloween
Форумчанин
 
Регистрация: 24.04.2012
Сообщений: 300
По умолчанию

#define ONE_CONST_STR "один"
Помог? Оставляем отзыв =)
Helloween вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Статический член класса halcyon Visual C++ 1 28.09.2012 21:09
Оператор сдвига как член класса Anubys Общие вопросы C/C++ 0 25.12.2011 02:44
Функция - член класса Syltan Общие вопросы C/C++ 9 06.10.2009 23:44
Указатеть на функция-член класса BioS Общие вопросы C/C++ 6 29.09.2009 00:04
Как изменить статический приватный член класса?? 3dgraph Помощь студентам 2 07.05.2009 20:06