Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
infobos
Строитель
454 / 70 / 4
Регистрация: 18.06.2010
Сообщений: 499
#1

Как лучше сделать глобальную переменную?

08.01.2017, 09:11. Просмотров 1138. Ответов 35
Метки нет (Все метки)

Интернет совсем пустой в плане глобальных переменных на с++

Задача следующая:
1. Нужно создать много глобальных переменных будет штук 100 к примеру. Каждую объявлять не интересно.
2. Глобальные переменные должны быть доступны всем файлам спп.
3. Я не хочу объявлять 100 переменных для каждого файла через extern
4. Лучше создать структуру или класс для этого. и объявить класс или структуру для файла спп.
5. Нужно что-нибудь статическое. Сразу создал класс или структуру и тут же прямо в классе объявляешь значение каждой глобальной переменной.
6. Каждая глобальная переменная должна иметь возможность на прямую менять значение.
7. Я не хочу писать много кода. 100 переменных умножать в два раза и потом получить 200 строк кода. Увольте. Дайте простой рецепт.

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.01.2017, 09:11
Ответы с готовыми решениями:

Как сделать одну глобальную переменную
Есть многофайловый проект. К примеру 5 файлов(5 "H" файлов+для них 5 "срр"...

Как создать глобальную переменную?
Создаю небольшой проект. Несколько функций и собственно тело программы. В теле...

Как обьявить глобальную переменную
Как объявить глобальную переменную Есть несколько *CPP* и *.h* файлы. Надо...

Как создать глобальную переменную?
Доброй ночи. Спасайте. Надо создать глобальную переменную string, Значение...

Как глобальную переменную засунуть в структуру?
#include<stdio.h> #include<malloc.h> #include<string.h> typedef struct...

35
0x10
2560 / 1740 / 285
Регистрация: 24.11.2012
Сообщений: 4,364
08.01.2017, 09:17 #2
Цитата Сообщение от infobos Посмотреть сообщение
Нужно создать много глобальных переменных будет штук 100 к примеру.
Зачем? Какая исходная проблема решается?
0
infobos
Строитель
454 / 70 / 4
Регистрация: 18.06.2010
Сообщений: 499
08.01.2017, 09:32  [ТС] #3
Цитата Сообщение от 0x10 Посмотреть сообщение
Зачем? Какая исходная проблема решается?
Конфигурация программы. Это большой проект. Много файлов спп. И каждый решает свою задачу.
Каждому файлу спп нужен доступ к глобальным переменным.
Писать к каждому фалу спп объявление 100 строк кода просто ужасно. Проще объявить один класс или структуру для одного файла спп.
Знаю что возможно. Но пока не понял как это сделать.

Добавлено через 10 минут
Вот на ум приходит следующий код:
C++
1
2
3
4
5
6
7
8
9
10
11
class S{
public:
static int x1;//Глобальная переменная 1
static int x2;//Глобальная переменная 2
static int x3;
static int x4;
};
    int S::x1=1;//Глобальная переменная 1
    int S::x2=2;//Глобальная переменная 2
    int S::x3=3;
    int S::x4=4;
Может есть что-то по проще типа:
C++
1
2
3
4
5
6
7
class S{
public:
static int x1=1;//Глобальная переменная 1
static int x2=2;//Глобальная переменная 2
static int x3=3;
static int x4=4;
};
Но этот код не работает! потому что дать значение внутри класса запрещено!
Проблема в том, что нужно писать два раза переменную. А это лишние хлопоты. Строк в два раза больше получается.
0
0x10
2560 / 1740 / 285
Регистрация: 24.11.2012
Сообщений: 4,364
08.01.2017, 09:39 #4
Решение в лоб:
C++
1
2
3
4
5
6
class AppConfig
{
public:
    static constexpr int answer = 42;
    static constexpr double pi = 3.1415;
};
Добавлено через 2 минуты
Цитата Сообщение от infobos Посмотреть сообщение
Проблема в том, что нужно писать два раза переменную. А это лишние хлопоты. Строк в два раза больше получается.
Это меньшая из проблем. Основная проблема такой архитектуры — сильная связность всех компонентов, которые используют конфигурацию и потенциальное затруднение покрытия тестами. Скорее всего, не всем подсистемам нужны абсолютно все параметры из конфигурации. Возможно, не все параметры конфигурации могут быть определены на этапе компиляции. И вот эту проблему уже нужно решать. А дублирование строк из-за необходимости написания объявления и определения — мелочи.
0
infobos
Строитель
454 / 70 / 4
Регистрация: 18.06.2010
Сообщений: 499
08.01.2017, 09:41  [ТС] #5
Моя среда не понимает оператор: constexpr
Она откуда. из какой библиотеки?
0
0x10
2560 / 1740 / 285
Регистрация: 24.11.2012
Сообщений: 4,364
08.01.2017, 09:42 #6
Цитата Сообщение от infobos Посмотреть сообщение
Моя среда не понимает оператор: constexpr
Она откуда. из какой библиотеки?
constexpr
0
infobos
Строитель
454 / 70 / 4
Регистрация: 18.06.2010
Сообщений: 499
08.01.2017, 09:47  [ТС] #7
Цитата Сообщение от 0x10 Посмотреть сообщение
constexpr
Как заставить работать этот оператор?
Компилятор его не понимает. Это не известное.
0
0x10
2560 / 1740 / 285
Регистрация: 24.11.2012
Сообщений: 4,364
08.01.2017, 09:49 #8
Цитата Сообщение от infobos Посмотреть сообщение
Компилятор его не понимает.
Закрепленная тема: Как включить в своей среде разработки поддержку определённого стандарта (С++11, С++14, С++17)
1
infobos
Строитель
454 / 70 / 4
Регистрация: 18.06.2010
Сообщений: 499
08.01.2017, 09:52  [ТС] #9
А со структурой код может не требует расширения? Может есть другие альтернативы?
0
Renji
2156 / 1515 / 461
Регистрация: 05.06.2014
Сообщений: 4,394
08.01.2017, 09:52 #10
Цитата Сообщение от infobos Посмотреть сообщение
1. Нужно создать много глобальных переменных будет штук 100 к примеру. Каждую объявлять не интересно.
В массив запихните. Возможно, даже, ассоциативный (std::map<std::string,int>).
Цитата Сообщение от 0x10 Посмотреть сообщение
static constexpr int answer = 42;
Этож константа, а просили переменную.
0
infobos
Строитель
454 / 70 / 4
Регистрация: 18.06.2010
Сообщений: 499
08.01.2017, 09:58  [ТС] #11
Цитата Сообщение от Renji Посмотреть сообщение
В массив запихните. Возможно, даже, ассоциативный (std::map<std::string,int>).
Можно пример кода? Массив возможно не подойдет, но задачи могут встретится.
0
Renji
2156 / 1515 / 461
Регистрация: 05.06.2014
Сообщений: 4,394
08.01.2017, 10:02 #12
Цитата Сообщение от infobos Посмотреть сообщение
Можно пример кода? Массив возможно не подойдет, но задачи могут встретится.
C++
1
2
3
    std::map<std::string,int> config{{"Speed",9000},{"mass",1}};
    config["Width"]=100;
    config["Height"]=500;
Первая строчка требует включенного C++11. Куда пристроить последние две - сами думайте.
1
infobos
Строитель
454 / 70 / 4
Регистрация: 18.06.2010
Сообщений: 499
08.01.2017, 10:19  [ТС] #13
А со структурой видимо тоже придется две переменные писать?
0
Renji
2156 / 1515 / 461
Регистрация: 05.06.2014
Сообщений: 4,394
08.01.2017, 10:21 #14
Цитата Сообщение от infobos Посмотреть сообщение
А со структурой видимо тоже придется две переменные писать?
C++
1
2
3
4
5
6
7
struct Config
{
    int A=1;
    int B=2;
    int C=3;
};
Config config;
Да, да, опять надо C++11.
0
0x10
2560 / 1740 / 285
Регистрация: 24.11.2012
Сообщений: 4,364
08.01.2017, 10:21 #15
Цитата Сообщение от infobos Посмотреть сообщение
А со структурой видимо тоже придется две переменные писать?
Структура отличается от класса только уровнем доступа по умолчанию.

Цитата Сообщение от Renji Посмотреть сообщение
Этож константа, а просили переменную.
Что хуже. Я в курсе. И поэтому выше написал, что основная проблема здесь — архитектура, а не дублирование кода.
0
infobos
Строитель
454 / 70 / 4
Регистрация: 18.06.2010
Сообщений: 499
08.01.2017, 10:23  [ТС] #16
Еще вопрос, как сделать, чтобы класс был виден другим файлам спп?
0
Renji
2156 / 1515 / 461
Регистрация: 05.06.2014
Сообщений: 4,394
08.01.2017, 10:26 #17
Цитата Сообщение от infobos Посмотреть сообщение
Еще вопрос, как сделать, чтобы класс был виден другим файлам спп?
Кинуть класс в .h файл, .h заинклудить во все нужные дырки. Но переменные (не статик-члены класса) в .h закинутся либо с глюками, либо с бубном.
0
infobos
Строитель
454 / 70 / 4
Регистрация: 18.06.2010
Сообщений: 499
08.01.2017, 10:45  [ТС] #18
Однако проблемы возникли в видимостью классов.
Подключать include в каждом классе не дает. Потому что возникают вторые и третьи объявления переменных.
Без подключения includ не видать.
Палка о двух концах...
0
Renji
2156 / 1515 / 461
Регистрация: 05.06.2014
Сообщений: 4,394
08.01.2017, 10:47 #19
Цитата Сообщение от infobos Посмотреть сообщение
Подключать include в каждом классе не дает. Потому что возникают вторые и третьи объявления переменных.
В .h подписать extern в начало объявления переменной, потом повторить ее объявление в каком-то одном .cpp (уже без extern).
0
0x10
2560 / 1740 / 285
Регистрация: 24.11.2012
Сообщений: 4,364
08.01.2017, 10:54 #20
Цитата Сообщение от infobos Посмотреть сообщение
Потому что возникают вторые и третьи объявления переменных.
Отсутствуют include guards?
1
08.01.2017, 10:54
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.01.2017, 10:54

Как и где описать глобальную переменную?
Как и где описать глобальную переменную? В главном класее я определяю...

Как обьявить глобальную переменную в функции?
Вопрос как объявить переменную в функции чтобы ей можно было пользоваться везде?

Как правильно создать глобальную переменную?
Как правильно создать глобальную переменную? Если она будет в заголовочном...


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

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

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