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

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

04.08.2012, 14:37. Показов 4217. Ответов 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
Модератор
Эксперт по электронике
8979 / 6745 / 921
Регистрация: 14.02.2011
Сообщений: 23,856
04.08.2012, 14:57
описываешь в каком нибудь .cpp
C++
1
 struct StructX { ... } Struct;
а в StructX.h
пишешь
C++
1
extern StructX  Struct;
extern это команда компилятору, что переменная определена в другом блоке
2
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 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
Модератор
Эксперт по электронике
8979 / 6745 / 921
Регистрация: 14.02.2011
Сообщений: 23,856
04.08.2012, 19:34
Цитата Сообщение от IGPIGP Посмотреть сообщение
Можно описать и определить Вашу sStructX в файлах sStructX.h и sStructX.cpp. Потом sStructX.h заинклудить в cpp-файлы тех классов методам которых она требуется.
ему нужно не описание структуры,а объект, и если его объявить в заголовочном файле то при подключении более одного то получишь ошибку линковки "объект объявлен в другом модуле"
1
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
04.08.2012, 20:05
Цитата Сообщение от ValeryS Посмотреть сообщение
ему нужно не описание структуры,а объект, и если его объявить в заголовочном файле то при подключении более одного то получишь ошибку линковки "объект объявлен в другом модуле"
Видимость объекта-структуры, ведь определится там, где будет объект класса..., но что бы методу класса работать с передаваемым или видимым объектом ему нужно знать определение? Вообще, наверно не понял вопроса. Классы ведь на то и есть инкапсулированные модули, что бы не нуждаться в глобальных переменных. Лучше может включить всю структуру как поле или передать отдельные элементы через поля? То что я предложил, паллиатив конечно.
0
Модератор
Эксперт по электронике
8979 / 6745 / 921
Регистрация: 14.02.2011
Сообщений: 23,856
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
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru