Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Нужны ли глобальные переменные? 
:(
    Опции темы
hoz
Дата 27.8.2014, 23:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 139
Регистрация: 27.6.2013

Репутация: нет
Всего: нет



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

имя структуры.имя члена-элемента( метода )

Или всё-таки создавать объект глобальным плохая идея?
Просто если уж придерживаться идеологии С++. То это инкапсуляция. А в моём раскладе получается, что я  создал глобальный объект на структуру. Но по скольку структура используется везде, то другого варианта я не нашёл.
Вопрос возник по случаю, когда я читал этот пост http://forum.vingrad.ru/topic-320428.html#, где borisbn дал понять, что глобальные переменные использовать не рекомендует. Почему я не понял, но.. тем не менее.

Это сообщение отредактировал(а) hoz - 27.8.2014, 23:53
PM MAIL   Вверх
Guinness
Дата 28.8.2014, 09:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 310
Регистрация: 21.6.2009
Где: Зеленоград

Репутация: 2
Всего: 10



Цитата(hoz @  28.8.2014,  00:52 Найти цитируемый пост)
 Есть у меня структура. Она используется практически во всех моих классах. 

Цитата(hoz @  28.8.2014,  00:52 Найти цитируемый пост)
Если оно так, то проще создать объект прямо в файле где описание данной структуры и дальше данный инклюдник с структурой и созданным объектом включить во все файлы, где описываются классы, верно?

Так используется структура или один и тот же объект?
Цитата(hoz @  28.8.2014,  00:52 Найти цитируемый пост)
Или всё-таки создавать объект глобальным плохая идея?

Не самая здравая, особенно, если приложение достаточно большое, и в нём присутствует многопоточность. Хотя бывают случаи, когда это необходимо. Тогда в C++ используют паттерн Singleton. В C++11 он пишется несколько проще, чем в предыдущем стандарте. Однако, в любом случае геморрой с доступом к данным данной структуры Вам обеспечен.
А вообще сложно сказать, стоит ли делать глобальную переменную, ибо неизвестна архитектура приложения. В любом случае, лучше попытаться избегать глобальных переменных.
PM MAIL   Вверх
hoz
Дата 28.8.2014, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 139
Регистрация: 27.6.2013

Репутация: нет
Всего: нет



Цитата(Guinness @  28.8.2014,  09:51 Найти цитируемый пост)
Так используется структура или один и тот же объект?

Члены-элементы данной структуры. Бывает, что нужны члены-методы структуры или класса. Но члены являются общими для перечня других классов. Значит объект должен быть тот же, верно?
 Ведь, если объект будет другой, то значение члена-элемента соответствующей структуры будет другое..
 Ведь логично?


Цитата(Guinness @  28.8.2014,  09:51 Найти цитируемый пост)
Не самая здравая, особенно, если приложение достаточно большое, и в нём присутствует многопоточность.

Я по этому поводу читал, но не понимал. Как узнать наличие и необходимость многопоточности?
PM MAIL   Вверх
Guinness
Дата 28.8.2014, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 310
Регистрация: 21.6.2009
Где: Зеленоград

Репутация: 2
Всего: 10



Цитата(hoz @  28.8.2014,  14:47 Найти цитируемый пост)
Члены-элементы данной структуры. Бывает, что нужны члены-методы структуры или класса. Но члены являются общими для перечня других классов. Значит объект должен быть тот же, верно?
 Ведь, если объект будет другой, то значение члена-элемента соответствующей структуры будет другое..
 Ведь логично?

Логично, но звучит стрёмно. Если это действительно один объект, и он действительно должен быть разделяемым между другими объектами, и никак по другому нельзя осуществить с ним работу, кроме как объявлением его глобальной переменной, то выхода нет. Но я бы рекомендовал ещё разок подумать, может удастся как-то перепроектировать.
Цитата(hoz @  28.8.2014,  14:47 Найти цитируемый пост)
Я по этому поводу читал, но не понимал. Как узнать наличие и необходимость многопоточности? 

Вопрос интересный, я вряд ли смогу дать грамотный ответ на него. Узнать наличие можно посмотрев по коду запускаются ли где-то потоки. Или используются ли где-то сторонние классы, которые могут асинхронно вызывать Ваш код. Нужна ли параллельность? Это каждый решает сам. К примеру, GUI и бизнес-процессы, как правило, работают в разных потоках, дабы GUI не подвисал.
PM MAIL   Вверх
baldman88
Дата 28.8.2014, 15:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 210
Регистрация: 18.1.2009

Репутация: 1
Всего: 7



Про Singleton уже написали. Посмотрите еще на статические классы -- по смыслу они ближе всего к вашей "проблемной" структуре smile 
PM MAIL   Вверх
hoz
Дата 28.8.2014, 21:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 139
Регистрация: 27.6.2013

Репутация: нет
Всего: нет



 Ну а что тут удивительного то? Например, тип intdouble или string используются везде... и они глобальны. Ведь так? И никто не говорит, что это не хорошо. А когда другие глобальные переменные, то почему-то не хороший тон... Логика в чём?
PM MAIL   Вверх
baldman88
Дата 29.8.2014, 00:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 210
Регистрация: 18.1.2009

Репутация: 1
Всего: 7



Создается впечатление, что Вы путаете теплое с мягким. Что Вы понимаете под глобальными переменными? В ООП глобальные переменные -- признак плохого тона, даже если они встроенных типов.
PM MAIL   Вверх
Guinness
Дата 29.8.2014, 06:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 310
Регистрация: 21.6.2009
Где: Зеленоград

Репутация: 2
Всего: 10



Цитата(hoz @  28.8.2014,  22:51 Найти цитируемый пост)
 Ну а что тут удивительного то? Например, тип int, double или string используются везде... и они глобальны.

Цитата(Guinness @  28.8.2014,  10:51 Найти цитируемый пост)
Так используется структура или один и тот же объект?

Неспроста я задал этот вопрос. Класс/структура и объект - две разные вещи.
PM MAIL   Вверх
sQu1rr
Дата 29.8.2014, 09:54 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 597
Регистрация: 11.11.2008
Где: london

Репутация: 3
Всего: 13



Код

// #1
// Просто хедер со структурой со статичными методами, будет рабртать везде без особого напряга
struct StaticStruct {
    static int method1() const { return member; }
    static void method2(int m) { member = m }
    static int member;
};
...
StaticStruct::method2(3)
int y = StaticStruct::method1();
// # 2
// Просто хедер со структурой, включайте куда хотите, плодите объекты и вызывайте их методы
struct SomeStruct {
    int method1() const { return member; }
    void method2(int m) { member = m }
    int member;
};
...
SomeStruct x;
x.method2(3)
int y = x.method1();
// #3 : #2
// Второй вариант, но синглтон, имеет метод который возвращает один и тот же объект
    static SomeStruct & getInstance() const { static SomeStruct x; return x; }
...
SomeStruct::getInstance().method2(3);
...
// #4
// можно веселиться с экстернами

pick one что бы все были в теме о чем идет речь
PS не стоит принимать мой код в серьез, писал левой задней ногой

Это сообщение отредактировал(а) sQu1rr - 29.8.2014, 09:55
PM MAIL Skype GTalk   Вверх
hoz
Дата 30.8.2014, 14:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 139
Регистрация: 27.6.2013

Репутация: нет
Всего: нет



Цитата(baldman88 @  29.8.2014,  00:27 Найти цитируемый пост)
Создается впечатление, что Вы путаете теплое с мягким. Что Вы понимаете под глобальными переменными? В ООП глобальные переменные -- признак плохого тона, даже если они встроенных типов. 

Да, я не верно выразился. Я имел ввиду объекты, которые общедоступны для всех классов. Они ведь являются глобальными, если с ними работают, если и не все, но большинство классов, так? Это ж как переменные..
Дабы объяснить ситуацию, опишу что нужно.

 Есть та же структура (одна из них), члены-элементы и члены-методы которой используются различными классами. По крайне мере такая возможность должна быть. Причём другие классы должны работать не с разными копиями членов-элементов объектов интересующей нас структуры, а именно с этой! Т.к. в этой копии объекта структуры хранятся важные данные, которые, скажем так, нет необходимость пересчитывать каждый раз, а только по необходимости. И все классы этот момент по-своему контролируют. Понятно изъясняюсь?
Вот такой вот момент.
 В начале написания первого проекта посредством ООП я создавал объекты сразу после описания класса( структуры ), как показал sQu1rr.
 Но правильно ли это? Подумав, я понял, что признаком хорошего тона программирования это не является, т.к. не все объекты, и не все классы используются всегда. К тому же отличительной чертой С++ является инкапсуляция. А если объект виден "всем", и, даже там, где он не используется, это не логично.
 Вот решил переписать то, что есть с учётом адекватного подхода. Потому и возникают вопросы.

Это сообщение отредактировал(а) hoz - 30.8.2014, 16:35
PM MAIL   Вверх
hoz
Дата 30.8.2014, 23:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 139
Регистрация: 27.6.2013

Репутация: нет
Всего: нет



Цитата(Guinness @  29.8.2014,  06:59 Найти цитируемый пост)
Неспроста я задал этот вопрос. Класс/структура и объект - две разные вещи. 

Один и тот же объект соответствующей структуры.
PM MAIL   Вверх
hoz
Дата 31.8.2014, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 139
Регистрация: 27.6.2013

Репутация: нет
Всего: нет



Цитата(sQu1rr @  29.8.2014,  09:54 Найти цитируемый пост)
// #1
// Просто хедер со структурой со статичными методами, будет рабртать везде без особого напряга
struct StaticStruct {
    static int method1() const { return member; }
    static void method2(int m) { member = m }
    static int member;
};
...
StaticStruct::method2(3)
int y = StaticStruct::method1();

По ходу в данном коде в поле:
Код

static int method1() const { return member; }

модификатор доступа static лишний. Т.к. данный метод только возвращает, а не преобразовывает статический член-элемент static int member. Так?
Я так понимаю, в данной строке:
Код

StaticStruct::method2(3)

создаётся статический метод.
А в этой как понимать присвоение к y метода method2() тут?
Код

int y = StaticStruct::method1();


Это сообщение отредактировал(а) hoz - 31.8.2014, 13:58
PM MAIL   Вверх
hoz
Дата 31.8.2014, 14:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 139
Регистрация: 27.6.2013

Репутация: нет
Всего: нет



Цитата(sQu1rr @  29.8.2014,  09:54 Найти цитируемый пост)
// # 2
// Просто хедер со структурой, включайте куда хотите, плодите объекты и вызывайте их методы
struct SomeStruct {
    int method1() const { return member; }
    void method2(int m) { member = m }
    int member;
};
...
SomeStruct x;
x.method2(3)
int y = x.method1();

А статическим делать не нужно разве члены? Странно как-то..
PM MAIL   Вверх
baldman88
Дата 1.9.2014, 09:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 210
Регистрация: 18.1.2009

Репутация: 1
Всего: 7



Цитата(hoz @  31.8.2014,  13:56 Найти цитируемый пост)
По ходу в данном коде в поле:
Код
static int method1() const { return member; }

модификатор доступа static лишний. Т.к. данный метод только возвращает, а не преобразовывает статический член-элемент static int member. Так?

Нет не лишний. К статическому полю может обращаться только статический метод. А вот модификатор const лишний.
Модификатор static позволяет сделать метод либо поле общим для всех экземпляров (глобальным, если можно так сказать, хотя аналогия неудачная, но все же).
PM MAIL   Вверх
hoz
Дата 1.9.2014, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 139
Регистрация: 27.6.2013

Репутация: нет
Всего: нет



Цитата(baldman88 @  1.9.2014,  09:27 Найти цитируемый пост)
А вот модификатор const лишний.

Это ещё почему? Ведь данная конструкция является геттером, а значит, она не изменяется ни одно поле.

И вообще, зачем тут геттер, если это структура, а не класс? В структуре же все члены являются открытыми, а значит к ним можно обращаться напрямую минуя геттеры и сеттеры?
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0578 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.