Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/21: Рейтинг темы: голосов - 21, средняя оценка - 4.57
 Аватар для Lilim
7 / 7 / 0
Регистрация: 24.12.2011
Сообщений: 55

Глобальные переменные

04.08.2012, 14:37. Показов 4233. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем доброго времени суток!
Пишу програмку на VC++ 2008 со следующей структурой исходного кода:

В филтре (папке) "Заголовочные файлы"
Class1.h
Class2.h
Class3.h
...
ClassN.h
Global.h
в каждом из которых (кроме Global.h) примерно следующее -

C++
1
2
3
4
5
6
7
8
 #ifndef _CLASS1_H_
 #define _CLASS1_H_
 
 class cClass1
 {
    ...
 };
 #endif
а Global.h собирает все заголовочные файлы в кучу -

C++
1
2
3
4
5
6
7
8
9
10
 #ifndef _GLOBAL_H_
 #define _GLOBAL_H_
 
 #include "Class1.h"
 #include "Class2.h"
 #include "Class3.h"
 ...
 #include "ClassN.h"
 
 #endif
Далее идёт фильтр "Файлы исходного кода":
Class1.cpp
Class2.cpp
Class3.cpp
...
ClassN.cpp
WinMain.cpp
в которых естественно реализация функций соответствующих классов

C++
1
2
3
4
5
6
 #include "Global.h"
 
 void cClass1::Func1()
 ...
 ...
 ...
ну и в файле WinMain.cpp код главной функции

C++
1
2
3
4
5
6
7
8
9
10
11
12
 #include "Global.h"
 
 int WINAPI WinMain(...)
 {
    cClass1 Object1;
    cClass2 Object2;
    cClass3 Object3;
    ...
    cClassN ObjectN;
    ...
    return 0;
 }
В структуре struct sStructX хранятся переменные необходимые функциям некоторых включаемых классов (сама структура включается также через "Global.h"). Экземпляр этой структуры создаётся в WinMain(...) и там же заполняются его переменные. Хотелось бы сделать экземпляр структуры глобальным и видимым для всех классов чтобы не передавать его как параметр.
Вот тут начинаются проблемы, если в StructX.h (а он включается в Global.h) написать struct StructX { ... } Struct; то ругается "errer LNK 2005" и то что Struct уже объявлена в WinMain.obj холя в файле заголовке StructX.h также есть директива #ifndef. Когда же удаляю вкличение StructX.h из Global.h и включаю в WinMain.cpp перед #include "Global.h" то все классы из Global.h не видят глобальную переменную Struct.

Подскажите как объявить глобальную переменную видимую для всех классов?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
04.08.2012, 14:37
Ответы с готовыми решениями:

Глобальные и статические глобальные переменные
Скажите, чем отличаются глобальные переменные от статических глобальных переменных?

Глобальные переменные
Есть ли способ явно обратиться к глобальной переменной ? Или в чем может быть глюк ? Переменная объявлена в Globals формы в...

глобальные переменные
Пробовал объявить глобальные переменные следующим образом: в заголовочном файле head.h #ifndef DF_H #define DF_H //объявления...

5
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,871
04.08.2012, 14:57
описываешь в каком нибудь .cpp
C++
1
 struct StructX { ... } Struct;
а в StructX.h
пишешь
C++
1
extern StructX  Struct;
extern это команда компилятору, что переменная определена в другом блоке
2
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
04.08.2012, 19:15
Цитата Сообщение от Lilim Посмотреть сообщение
В структуре struct sStructX хранятся переменные необходимые функциям некоторых включаемых классов (сама структура включается также через "Global.h").
Можно описать и определить Вашу sStructX в файлах sStructX.h и sStructX.cpp. Потом sStructX.h заинклудить в cpp-файлы тех классов методам которых она требуется.
1
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,871
04.08.2012, 19:34
Цитата Сообщение от IGPIGP Посмотреть сообщение
Можно описать и определить Вашу sStructX в файлах sStructX.h и sStructX.cpp. Потом sStructX.h заинклудить в cpp-файлы тех классов методам которых она требуется.
ему нужно не описание структуры,а объект, и если его объявить в заголовочном файле то при подключении более одного то получишь ошибку линковки "объект объявлен в другом модуле"
1
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
04.08.2012, 20:05
Цитата Сообщение от ValeryS Посмотреть сообщение
ему нужно не описание структуры,а объект, и если его объявить в заголовочном файле то при подключении более одного то получишь ошибку линковки "объект объявлен в другом модуле"
Видимость объекта-структуры, ведь определится там, где будет объект класса..., но что бы методу класса работать с передаваемым или видимым объектом ему нужно знать определение? Вообще, наверно не понял вопроса. Классы ведь на то и есть инкапсулированные модули, что бы не нуждаться в глобальных переменных. Лучше может включить всю структуру как поле или передать отдельные элементы через поля? То что я предложил, паллиатив конечно.
0
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,871
04.08.2012, 20:32
Цитата Сообщение от IGPIGP Посмотреть сообщение
Видимость объекта-структуры, ведь определится там, где будет объект класса...,
ну да
но ему нужно
Цитата Сообщение от Lilim Посмотреть сообщение
В структуре struct sStructX хранятся переменные необходимые функциям некоторых включаемых классов
Цитата Сообщение от Lilim Посмотреть сообщение
Хотелось бы сделать экземпляр структуры глобальным и видимым для всех классов чтобы не передавать его как параметр.
т.е один ГЛОБАЛЬНЫЙ объект
хотя это и моветон и лучше сделать ссылки
но, хозяин-барин

Добавлено через 3 минуты
а я бы сделал структуру классом
и определил бы методы Get... Set......
хотя бы есть гарантия что сдуру чего нибудь не поменяешь
но пускай ТС решает
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
04.08.2012, 20:32
Помогаю со студенческими работами здесь

Глобальные переменные
создал новый хедр и объявил там переменные, которые нужны в разных объектах, но что-то не работает как можно сделать такие переменные?...

Глобальные переменные
Как в C++ завести глобальную (общую для функции и самой программы) переменную?

Глобальные переменные
Есть такой код global $dir; $dir = 'C:/doc/'; function Show($path, $case_var) { echo ( $dir ); Почему ничего не выводит? Вроде...

Глобальные переменные
Доброго дня всем! Помогите плиз разобраться:-Перем глТекущийПользователь Экспорт; Мне необходимо получить ее значение в модуле объекта...

глобальные переменные
Уважаемые коллеги! Встал в тупик, пытаясь организовать связь двух модулей через глобальную переменную. Создаю 3 файла: ...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru