SSW
Гость
|
|
« : 09-07-2003 20:53 » |
|
Помогите! Как и где описать переменную, так чтоб была видна по всему проекту? Зарание благодарю!
|
|
|
Записан
|
|
|
|
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии
Offline
Пол:
Бодрый птах
|
|
« Ответ #1 : 09-07-2003 20:59 » |
|
Найди в проекте переменную theApp. Далее - рядом с ней можешь описывать любые переменные и константы - все будет глобальным... Для получения доступа в других файлах напиши в каждом нужном месте в начале файла extern тип переменная; Где тип и переменная - описание нужной глобальной переменной.
|
|
|
Записан
|
А птичку нашу прошу не обижать!!!
|
|
|
SSW
Гость
|
|
« Ответ #2 : 09-07-2003 23:39 » |
|
Огромное спасибо!
|
|
|
Записан
|
|
|
|
PSD
Главный специалист
Offline
Пол:
|
|
« Ответ #3 : 10-07-2003 04:35 » |
|
Найди в проекте переменную theApp. Далее - рядом с ней можешь описывать любые переменные и константы - все будет глобальным... Для получения доступа в других файлах напиши в каждом нужном месте в начале файла extern тип переменная; Где тип и переменная - описание нужной глобальной переменной.
У меня тут такие грабли с этой theApp не видят ее мои классы, а не видят потому что в CPP она обявлена. пишешь так СWnd * f=theApp.GetMainWnd(); и получаешь D:\ds\MyProjects\TestMFC\TestMFCDoc.cpp(75) : error C2065: 'theApp' : undeclared identifier Как до нее достучаться?
|
|
|
Записан
|
Да да нет нет все остальное от лукавого.
|
|
|
Антон (LogRus)
|
|
« Ответ #4 : 10-07-2003 04:55 » |
|
Вот тут ответ на твой ворос PSD, првда на англицком т.к. VC у меня нет то тестить придётся тебе, а так я тестирую ответы обычно. http://www.microsoft.com/msj/archive/s202c.aspxпервый вопрос и еще посмотри вот сдесь пример в VC C:\Program Files\Visual Studio .NET 2002\Samples\Visual C++ Samples\mfc_general_hello его можно скачать с MSDN
|
|
|
Записан
|
Странно всё это....
|
|
|
PSD
Главный специалист
Offline
Пол:
|
|
« Ответ #5 : 10-07-2003 05:01 » |
|
Нет про то как достучаться до нее методами MFC я знаю.
Но это кроме всего прочего глобальня переменная и значит теоретически к ней можно обратися из любого места прораммы, без захвата "текущих" апликаций.
Тема была какая "как создать глобальную переменную" гром посоветовал обявить ее рядом с theApp у меня законный вопрос а как потом до ентой переменной достукиваться?
|
|
|
Записан
|
Да да нет нет все остальное от лукавого.
|
|
|
Lex
|
|
« Ответ #6 : 10-07-2003 05:09 » |
|
А в header файле не забыли ее описать с добавлением extern
Я например в MFC проектах добавляю в файл MyApp.h строчку где-нить после определения класса.
extern CMyApp theApp;
Тогда она видна по всему проекту. Аналогично и со своими переменными. Или тоже самое(с extern) можно писать прямо в начале .с файла.
Зона видимости всех переменных, даже глобальных файл. Следовательно тебе нужно объявлять переменную в каждом файле. Extern указывает компилятору, что переменная создана и находится в каком-то другом файле.
|
|
|
Записан
|
Megabyte be with you!
|
|
|
PSD
Главный специалист
Offline
Пол:
|
|
« Ответ #7 : 10-07-2003 05:11 » |
|
extern CMyApp theApp;
Вот это я и хотел узнать.
|
|
|
Записан
|
Да да нет нет все остальное от лукавого.
|
|
|
Lex
|
|
« Ответ #8 : 10-07-2003 05:13 » |
|
Не знаю, почему микрософт это не сделал. Это напрашивается само сабой, если они делают theApp глобальной
|
|
|
Записан
|
Megabyte be with you!
|
|
|
Антон (LogRus)
|
|
« Ответ #9 : 10-07-2003 05:26 » |
|
Извите не понял! :oops:
|
|
|
Записан
|
Странно всё это....
|
|
|
PSD
Главный специалист
Offline
Пол:
|
|
« Ответ #10 : 10-07-2003 05:39 » |
|
Извите не понял! :oops: Все просто в MFC проекте есть глобальня переменя theApp через которую можно очень просто управлять приложением (это верхняя точка иерархии объектов). Но изначадльно она не доступна из других частей программы потому что обявленя в срр файле и просто не видна из других модулей. Это один из вариантов как можно получить доступ к обекту приложения.
|
|
|
Записан
|
Да да нет нет все остальное от лукавого.
|
|
|
SlavaI
Главный специалист
Offline
|
|
« Ответ #11 : 10-07-2003 06:02 » |
|
Блин, ну и задал вопрос. Сам бы я никогда не допер, что он к MFC относится. У меня вопрос к SSW- как ты предполагал, что люди догадаются о том что вопрос про MFC, почему нельзя написать в вопросе что проблема возникла при работе с MFC. MFC-это не стандартный C++. Если человек работает с WTL, или вобще для Linux пищет, то он что угодно может подумать про твой вопрос. Ну надо же понимать что MFC-это некий частный случай, а вопрос так глобально звучит. Ответ на твой вопрос, который можно дать, если не думать об MFC- объяви переменную вне всех классов и ф-ций, или сделай переменную статическим членом класса.
|
|
|
Записан
|
|
|
|
PSD
Главный специалист
Offline
Пол:
|
|
« Ответ #12 : 10-07-2003 06:08 » |
|
А он не справшиал конкретно про MFC он спаршивал "как сделать глобалной" , это гром дал четкие указания по MFC(хотя может укогото еще такая переменая есть но я не видел ) проекту (орентир theApp). А я точно знаю что в VC если обявить чтото свое рядом с theApp светится она будет как глобальня но братится кней напрямую без дополнительных телодвижений нельзя. И пошло поехало.
|
|
|
Записан
|
Да да нет нет все остальное от лукавого.
|
|
|
Lex
|
|
« Ответ #13 : 10-07-2003 06:10 » |
|
SlavaI, SSW задавал вопрос не по MFC а вообще. Это PSD про MFC спросил. Ну и Гром слегка в сторону MFC увел ответ.
|
|
|
Записан
|
Megabyte be with you!
|
|
|
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии
Offline
Пол:
Бодрый птах
|
|
« Ответ #14 : 10-07-2003 06:53 » |
|
Все вопросы SSW касались MFC логично предположить, что и этот к ним относится, так как человек с MFC работает...
|
|
|
Записан
|
А птичку нашу прошу не обижать!!!
|
|
|
Lex
|
|
« Ответ #15 : 10-07-2003 07:48 » |
|
Гром, я вот такую статистику вопросов не отслеживаю, поэтому мне предположить это трудно. И во многом я согласен со Славой и не один раз уже это писал. НАРОД, ЗАДАВАЙТЕ ВОПРОС ПРАВИЛЬНО И КАК МОЖНО ПОЛНЕЕ. Тогда можно ответить более предметно.
|
|
|
Записан
|
Megabyte be with you!
|
|
|
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии
Offline
Пол:
Бодрый птах
|
|
« Ответ #16 : 10-07-2003 07:52 » |
|
С этим и я согласен... А статистику я тоже не вел - просто вечером вчера - подряд вопросы задавались
|
|
|
Записан
|
А птичку нашу прошу не обижать!!!
|
|
|
awolf
Гость
|
|
« Ответ #17 : 10-07-2003 14:06 » |
|
А вообще, какая разница, использует человек MFC или какую-дибо другую технологию. Правила объявления переменных одинаковы практически во всех случаях. SSW, можно почитать книженцию Кернигана и Риччи про язык Си - там все прекрасно расписано, как объявить глобальные, статические и т.д. переменные.
В каком нить заголовочном файле объявляешь extern unsigned long global_var;
В каком-нить сишнике инициализируешь ее unsigned long global_var = 0;
Вот тебе глобальная переменная
|
|
|
Записан
|
|
|
|
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии
Offline
Пол:
Бодрый птах
|
|
« Ответ #18 : 10-07-2003 18:26 » |
|
А вообще, какая разница, использует человек MFC
В данном случае я привязался к переменной theApp которая существует в MFC
|
|
|
Записан
|
А птичку нашу прошу не обижать!!!
|
|
|
Lex
|
|
« Ответ #19 : 11-07-2003 05:14 » |
|
awolf, разница в понимани объяснений. Особенно если только-только начинаешь изучать, то фраза типа в каком-нибудь заголовочном файле и т.п. ставит в тупик. Гораздо понятнее для человека, когда ему говорят, найди такуюто строку и сделай так же. Когда человек более или менее освоился он начнет адекватно воспринимать более общие объяснения.
|
|
|
Записан
|
Megabyte be with you!
|
|
|
SlavaI
Главный специалист
Offline
|
|
« Ответ #20 : 11-07-2003 05:51 » |
|
У Страуструпа на личной странице висит интересное замечание про статические члены класса- вот оно If you want a constant that you can use in a constant expression, say as an array bound, you have two choices:
class X { static const int c1 = 7; enum { c2 = 19 };
char v1[c1]; char v2[c2];
// ... };
At first glance, the declaration of c1 seems cleaner, but note that to use that in-class initialization syntax, the constant must be a static const of integral or enumeration type initialized by a constant expression. That's quite restrictive: class Y { const int c3 = 7; // error: not static static int c4 = 7; // error: not const static const float c5 = 7; // error not integral };
I tend to use the "enum trick" because it's portable and doesn't tempt me to use non-standard extensions of the in-class initialization syntax. So why do these inconvenient restrictions exist? A class is typically declared in a header file and a header file is typically included into many translation units. However, to avoid complicated linker rules, C++ requires that every object has a unique definition. That rule would be broken if C++ allowed in- class definition of entities that needed to be stored in memory as objects. See D&E for an explanation of C++'s design tradeoffs.
You have more flexibility if the const isn't needed for use in a constant expression:
class Z { static char* p; // initialize in definition const int i; // initialize in constructor public: Z(int ii) :i(ii) { } };
char* Z::p = "hello, there";
You can take the address of a static member if (and only if) it has an out-of- class definition: class AE { // ... public: static const int c6 = 7; static const int c7 = 31; };
const int AE::c7; // definition
int f() { const int* p1 = &AE::c6; // error: c6 not an lvalue const int* p2 = &AE::c7; // ok // ... }
|
|
« Последнее редактирование: 19-11-2007 07:00 от RXL »
|
Записан
|
|
|
|
Lex
|
|
« Ответ #21 : 11-07-2003 05:54 » |
|
Прикольно
|
|
|
Записан
|
Megabyte be with you!
|
|
|
|