![]() |
|
Модераторы: bsa |
![]()
|
|
| hoz |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 139 Регистрация: 27.6.2013 Репутация: нет Всего: нет |
Есть у меня структура. Она используется практически во всех моих классах. Возник вопрос. Если оно так, то проще создать объект прямо в файле где описание данной структуры и дальше данный инклюдник с структурой и созданным объектом включить во все файлы, где описываются классы, верно?
А там уже обращаться так:
Или всё-таки создавать объект глобальным плохая идея? Просто если уж придерживаться идеологии С++. То это инкапсуляция. А в моём раскладе получается, что я создал глобальный объект на структуру. Но по скольку структура используется везде, то другого варианта я не нашёл. Вопрос возник по случаю, когда я читал этот пост http://forum.vingrad.ru/topic-320428.html#, где borisbn дал понять, что глобальные переменные использовать не рекомендует. Почему я не понял, но.. тем не менее. Это сообщение отредактировал(а) hoz - 27.8.2014, 23:53 |
|||
|
||||
| Guinness |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 310 Регистрация: 21.6.2009 Где: Зеленоград Репутация: 2 Всего: 10 |
Так используется структура или один и тот же объект? Не самая здравая, особенно, если приложение достаточно большое, и в нём присутствует многопоточность. Хотя бывают случаи, когда это необходимо. Тогда в C++ используют паттерн Singleton. В C++11 он пишется несколько проще, чем в предыдущем стандарте. Однако, в любом случае геморрой с доступом к данным данной структуры Вам обеспечен. А вообще сложно сказать, стоит ли делать глобальную переменную, ибо неизвестна архитектура приложения. В любом случае, лучше попытаться избегать глобальных переменных. |
|||
|
||||
| hoz |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 139 Регистрация: 27.6.2013 Репутация: нет Всего: нет |
Члены-элементы данной структуры. Бывает, что нужны члены-методы структуры или класса. Но члены являются общими для перечня других классов. Значит объект должен быть тот же, верно? Ведь, если объект будет другой, то значение члена-элемента соответствующей структуры будет другое.. Ведь логично?
Я по этому поводу читал, но не понимал. Как узнать наличие и необходимость многопоточности? |
|||
|
||||
| Guinness |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 310 Регистрация: 21.6.2009 Где: Зеленоград Репутация: 2 Всего: 10 |
Логично, но звучит стрёмно. Если это действительно один объект, и он действительно должен быть разделяемым между другими объектами, и никак по другому нельзя осуществить с ним работу, кроме как объявлением его глобальной переменной, то выхода нет. Но я бы рекомендовал ещё разок подумать, может удастся как-то перепроектировать.
Вопрос интересный, я вряд ли смогу дать грамотный ответ на него. Узнать наличие можно посмотрев по коду запускаются ли где-то потоки. Или используются ли где-то сторонние классы, которые могут асинхронно вызывать Ваш код. Нужна ли параллельность? Это каждый решает сам. К примеру, GUI и бизнес-процессы, как правило, работают в разных потоках, дабы GUI не подвисал. |
|||
|
||||
| baldman88 |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 210 Регистрация: 18.1.2009 Репутация: 1 Всего: 7 |
Про Singleton уже написали. Посмотрите еще на статические классы -- по смыслу они ближе всего к вашей "проблемной" структуре
|
|||
|
||||
| hoz |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 139 Регистрация: 27.6.2013 Репутация: нет Всего: нет |
Ну а что тут удивительного то? Например, тип int, double или string используются везде... и они глобальны. Ведь так? И никто не говорит, что это не хорошо. А когда другие глобальные переменные, то почему-то не хороший тон... Логика в чём?
|
|||
|
||||
| baldman88 |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 210 Регистрация: 18.1.2009 Репутация: 1 Всего: 7 |
Создается впечатление, что Вы путаете теплое с мягким. Что Вы понимаете под глобальными переменными? В ООП глобальные переменные -- признак плохого тона, даже если они встроенных типов.
|
|||
|
||||
| Guinness |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 310 Регистрация: 21.6.2009 Где: Зеленоград Репутация: 2 Всего: 10 |
||||
|
||||
| sQu1rr |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 597 Регистрация: 11.11.2008 Где: london Репутация: 3 Всего: 13 |
pick one что бы все были в теме о чем идет речь PS не стоит принимать мой код в серьез, писал левой задней ногой Это сообщение отредактировал(а) sQu1rr - 29.8.2014, 09:55 |
|||
|
||||
| hoz |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 139 Регистрация: 27.6.2013 Репутация: нет Всего: нет |
Да, я не верно выразился. Я имел ввиду объекты, которые общедоступны для всех классов. Они ведь являются глобальными, если с ними работают, если и не все, но большинство классов, так? Это ж как переменные.. Дабы объяснить ситуацию, опишу что нужно. Есть та же структура (одна из них), члены-элементы и члены-методы которой используются различными классами. По крайне мере такая возможность должна быть. Причём другие классы должны работать не с разными копиями членов-элементов объектов интересующей нас структуры, а именно с этой! Т.к. в этой копии объекта структуры хранятся важные данные, которые, скажем так, нет необходимость пересчитывать каждый раз, а только по необходимости. И все классы этот момент по-своему контролируют. Понятно изъясняюсь? Вот такой вот момент. В начале написания первого проекта посредством ООП я создавал объекты сразу после описания класса( структуры ), как показал sQu1rr. Но правильно ли это? Подумав, я понял, что признаком хорошего тона программирования это не является, т.к. не все объекты, и не все классы используются всегда. К тому же отличительной чертой С++ является инкапсуляция. А если объект виден "всем", и, даже там, где он не используется, это не логично. Вот решил переписать то, что есть с учётом адекватного подхода. Потому и возникают вопросы. Это сообщение отредактировал(а) hoz - 30.8.2014, 16:35 |
|||
|
||||
| hoz |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 139 Регистрация: 27.6.2013 Репутация: нет Всего: нет |
||||
|
||||
| hoz |
|
||||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 139 Регистрация: 27.6.2013 Репутация: нет Всего: нет |
По ходу в данном коде в поле:
модификатор доступа static лишний. Т.к. данный метод только возвращает, а не преобразовывает статический член-элемент static int member. Так? Я так понимаю, в данной строке:
создаётся статический метод. А в этой как понимать присвоение к y метода method2() тут?
Это сообщение отредактировал(а) hoz - 31.8.2014, 13:58 |
||||||
|
|||||||
| hoz |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 139 Регистрация: 27.6.2013 Репутация: нет Всего: нет |
А статическим делать не нужно разве члены? Странно как-то.. |
|||
|
||||
| baldman88 |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 210 Регистрация: 18.1.2009 Репутация: 1 Всего: 7 |
Нет не лишний. К статическому полю может обращаться только статический метод. А вот модификатор const лишний. Модификатор static позволяет сделать метод либо поле общим для всех экземпляров (глобальным, если можно так сказать, хотя аналогия неудачная, но все же). |
|||
|
||||
| hoz |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 139 Регистрация: 27.6.2013 Репутация: нет Всего: нет |
Это ещё почему? Ведь данная конструкция является геттером, а значит, она не изменяется ни одно поле. И вообще, зачем тут геттер, если это структура, а не класс? В структуре же все члены являются открытыми, а значит к ним можно обращаться напрямую минуя геттеры и сеттеры? |
|||
|
||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |