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

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

Войти
Регистрация
Восстановить пароль
 
 
infobos
Строитель
353 / 66 / 1
Регистрация: 18.06.2010
Сообщений: 503
#1

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

08.01.2017, 09:11. Просмотров 868. Ответов 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
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как лучше сделать глобальную переменную? (C++):

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

Как создать глобальную переменную? - C++
Создаю небольшой проект. Несколько функций и собственно тело программы. В теле объявил переменную int rep. Далее мне надо обратиться к ней...

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

Как объявить глобальную переменную в Dev-C++ 4.9.9.2? - C++
Попробовал написать из справочника по С++ такую программу: #include <iostream> #include <windows.h> using namespace std; void...

Как и где описать глобальную переменную? - C++
Как и где описать глобальную переменную? В главном класее я определяю указутель на CDaoDatabase CDaoDatabase* DBase; DBase = new...

Как правильно создать глобальную переменную? - C++
Как правильно создать глобальную переменную? Если она будет в заголовочном файле, то при подключении этого файла к другим cpp, эта...

35
0x10
2479 / 1652 / 248
Регистрация: 24.11.2012
Сообщений: 4,093
08.01.2017, 09:17 #2
Цитата Сообщение от infobos Посмотреть сообщение
Нужно создать много глобальных переменных будет штук 100 к примеру.
Зачем? Какая исходная проблема решается?
0
infobos
Строитель
353 / 66 / 1
Регистрация: 18.06.2010
Сообщений: 503
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
2479 / 1652 / 248
Регистрация: 24.11.2012
Сообщений: 4,093
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
Строитель
353 / 66 / 1
Регистрация: 18.06.2010
Сообщений: 503
08.01.2017, 09:41  [ТС] #5
Моя среда не понимает оператор: constexpr
Она откуда. из какой библиотеки?
0
0x10
2479 / 1652 / 248
Регистрация: 24.11.2012
Сообщений: 4,093
08.01.2017, 09:42 #6
Цитата Сообщение от infobos Посмотреть сообщение
Моя среда не понимает оператор: constexpr
Она откуда. из какой библиотеки?
constexpr
0
infobos
Строитель
353 / 66 / 1
Регистрация: 18.06.2010
Сообщений: 503
08.01.2017, 09:47  [ТС] #7
Цитата Сообщение от 0x10 Посмотреть сообщение
constexpr
Как заставить работать этот оператор?
Компилятор его не понимает. Это не известное.
0
0x10
2479 / 1652 / 248
Регистрация: 24.11.2012
Сообщений: 4,093
08.01.2017, 09:49 #8
Цитата Сообщение от infobos Посмотреть сообщение
Компилятор его не понимает.
Закрепленная тема: Как включить в своей среде разработки поддержку определённого стандарта (С++11, С++14, С++17)
1
infobos
Строитель
353 / 66 / 1
Регистрация: 18.06.2010
Сообщений: 503
08.01.2017, 09:52  [ТС] #9
А со структурой код может не требует расширения? Может есть другие альтернативы?
0
Renji
1964 / 1362 / 308
Регистрация: 05.06.2014
Сообщений: 3,894
08.01.2017, 09:52 #10
Цитата Сообщение от infobos Посмотреть сообщение
1. Нужно создать много глобальных переменных будет штук 100 к примеру. Каждую объявлять не интересно.
В массив запихните. Возможно, даже, ассоциативный (std::map<std::string,int>).
Цитата Сообщение от 0x10 Посмотреть сообщение
static constexpr int answer = 42;
Этож константа, а просили переменную.
0
infobos
Строитель
353 / 66 / 1
Регистрация: 18.06.2010
Сообщений: 503
08.01.2017, 09:58  [ТС] #11
Цитата Сообщение от Renji Посмотреть сообщение
В массив запихните. Возможно, даже, ассоциативный (std::map<std::string,int>).
Можно пример кода? Массив возможно не подойдет, но задачи могут встретится.
0
Renji
1964 / 1362 / 308
Регистрация: 05.06.2014
Сообщений: 3,894
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
Строитель
353 / 66 / 1
Регистрация: 18.06.2010
Сообщений: 503
08.01.2017, 10:19  [ТС] #13
А со структурой видимо тоже придется две переменные писать?
0
Renji
1964 / 1362 / 308
Регистрация: 05.06.2014
Сообщений: 3,894
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
2479 / 1652 / 248
Регистрация: 24.11.2012
Сообщений: 4,093
08.01.2017, 10:21 #15
Цитата Сообщение от infobos Посмотреть сообщение
А со структурой видимо тоже придется две переменные писать?
Структура отличается от класса только уровнем доступа по умолчанию.

Цитата Сообщение от Renji Посмотреть сообщение
Этож константа, а просили переменную.
Что хуже. Я в курсе. И поэтому выше написал, что основная проблема здесь — архитектура, а не дублирование кода.
0
08.01.2017, 10:21
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.01.2017, 10:21
Привет! Вот еще темы с ответами:

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

Как глобальную переменную засунуть в структуру? - C++
#include&lt;stdio.h&gt; #include&lt;malloc.h&gt; #include&lt;string.h&gt; typedef struct Item { char *info; struct Item *next; ...

Можете подсказать,как правильно описать глобальную переменную - C++
Как правильно описать глобальную переменную чтоб читалась во всех формах программы,и можно ли ,допустим при нажатие на кнопку в форме2...

Как инициализировать глобальную переменную в зависимости от количества строк в файле - C++
Есть переменная типа int glob = 3; объявлена в не main(), т.е. глобальная. После неё, тоже не в mаin, объявлены структуры ex: struct...


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

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

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