ورود

View Full Version : متغییرهای Global و Namespace



sunrider
شنبه 05 خرداد 1386, 10:40 صبح
سلام

من یک برنامه SDI نوشته ام که دوتا آرایه از نوع CObArray داره که تنها راه دسترسی به اون از داخل کلاس View و Doc هستش.
برای اینکه تمامی ممبرفانکشن ها درون کلاس View متمرکز نشه نیاز دارم که این آرایه ها در تمامی کلاسها قابل دسترس باشند.
وقتی یک کلاس تعریف میکنم و از درون اون سایز آرایه رو میخونم عدد صفر رو برمیگردونه!؟!؟
این نشون میده که آرایه درون کلاس قابل دسترس نیست.
هر دو آرایه رو بصورت Global تعریف کردم (یعنی خارج از کلاس، درون فایل .h) ولی از درون کلاسهای دیگه قابل دسترس نیست.
از عدم وجود آرایه ایراد نمیگیره، فقط اندازه آرایه رو صفر برمیگردونه؟!
وقتی هم که بخوام به یک عضوی از آرایه دسترسی داشته باشم در حین اجرای برنامه پیغام خطای زیر رو نشون میده.
invelid argument encontered

سوال اینه:
چطور میشه یک آرایه را طوری تعریف کرد که در تمامی کلاسها قابل دسترس باشه، نه فقط در کلاس View و Doc؟
یا به عبارتی محل دقیق تعریف متغییر های Global در کجای سورس برنامه هست؟
درون فایلهای .h یا .cpp ؟
کجا متغییرهام رو تعریف کنم که همه جا قابل دسترس باشند (طبق تعریف Global Variable)



DXF.h
.
.

static CObArray m_DXF_Line_Float_Array
.
.
.

saeid5977
شنبه 05 خرداد 1386, 15:53 عصر
سلام
تو stdafx.h میشه فقط باید static تعریف بشه. میتونی تو هر کلاست یه pointer به آرایت داشته باشی.

sunrider
دوشنبه 07 خرداد 1386, 20:07 عصر
سلام
تو stdafx.h میشه فقط باید static تعریف بشه. میتونی تو هر کلاست یه pointer به آرایت داشته باشی.

سلام
با تشکر از saeid5977 راهنمایی شما خیلی کمکم کرد

یک سوال دارم
وقتی از داخل یک ممبر فانکشن، یک ممبر فانکشن دیگه رو صدا میزنیم، متغییرهای ممبر فانکشن دوم که PUBLIC هم هستند برای خود فانکشن دوم نیز قابل دسترس نیست.

شرح مختصری از مشکل:
یک منو تعریف کردم که آیتمی از اون به یک فانکشن در کلاس CMyClassView ارجاع داده میشه. سپس این فانکشن اول یک ممبر فانکشنی از کلاس CClass_One رو صدا میزنه.
مشکل اینه که Member Variable های کلاس دوم که صدا شده (CClass_One) حتی برای خود این کلاس قابل دسترس نیست. دلیلش چیه؟

hisitech
دوشنبه 07 خرداد 1386, 23:12 عصر
سلام
یک مقدار پیچیده شد!

به طور منطقی اگر متغییر های یک کلاس از نوع private هم باشند ُ باید بتوان از درون فانکشن های همان کلاس به آنها دسترسی داشت.

در حالی که شما فرمودید اگر public هم باشند قابل دسترس نیستند.

حالا سعی کن یک تستی بکنی اگر بصورت عادی فانکشن رو کال کنی بازم دسترسی نداری؟
(نه تو در تو):متفکر:

حسین محمدی
سه شنبه 08 خرداد 1386, 13:48 عصر
با سلام
من به طور کامل متوجه منظور شما نشدم ولی فکر می کنم شما می خواهید از داخل یک کلاس دیگر متدهای یک کلاس دیگر را اجرا کنید. مثلا من خودم یک چنین مشکلی داشتم و من مشکل من این بود که می خواستم هنگامی که کاربر ماوس را در صفحه برنامه حرکت می دهد x و y آن در statusbar نوشته شود. حرکت ماوس در واقع یک event ای است که درون کلاس View رخ می دهد و می توان از طریق متد ()OnMouseMove آن را هندل کرد و x, y‌ محل ماوس را به دست آورد ولی نمی توان مستقیما از کلاس View به statusbar که در کلاس CMainFrame است دسترسی پیدا کرد و به آن بگوییم x, y را نشان دهد.
برای این کار ابتدا باید در کلاس CMainFrame یک متد برای نوشتن متن یا عدد در Statusbar‌بنویسیم و از کلاس View توسط SendMessage یا PostMessage یک message‌به کلاس CMainFrame بفرستیم تا در این کلاس با دریافت این Message تابع اجرا شده و روی statusbar هر آنچه که می خواهیم نوشته شود.
شاید منظور شما را متوجه نشده باشم !!!
اگر که مشکل شما به این روش حل می شود می توانم نمونه کدی را نیز برای شما بگذارم.

sunrider
چهارشنبه 09 خرداد 1386, 02:04 صبح
سلام بر همه عزیزان که زحمت کشیدن و پاسخ دادند.

این مفهوم متغییر و شیوه دسترسی به اون برای من تبدیل شده به یک مشکل.

با اینکه متغییر رو GLOBAL تعریف کردم، چگونگی دسترسی به فانکشن درون کلاس در کار متغییر تاثیر گذاره. مثلا فانکشن A از کلاس A ،فانکشن B رو ازکلاس B صدا میکنه و اون هم فانکشن C رو از کلاس C که وظیفه مقدار دهی به یک متغییر GLOBAL رو برعهدا داره صدا میکنه و تا اینجا کار به خوبی انجام میشه.
در این روند اگه فانکشن A در نظر گرفته نشود و فانکشن B از کلاس B صدا شود، با اینکه متغیرهای واسط درون B به درستی مقدار به خود گرفته اند ولی مقدار خودشون رو از طریق فانکشن C از کلاس C به متغییرهای GLOBAL منتقل نمی کنند.

جالب اینه که وقتی متغییر GLOBAL تعریف شد تمام کلاسها بدون اینکه از عدم تعریف یا غیر قابل دسترس بودن ایرادی بگیرند با این متغییر کار میکنند ولی متغییر GLOBAL رو همیشه با محتوای صفر در نظر میگیرند. این در حالی است که امکان تعریف مجدد متغییر با نامی همانند نام تغییر GLOBAL در هر یک از کلاسها وجود دارد و با اینکار متغییر جدید، متغییر GLOBAL رو Hide میکنه و باز هم امکان دسترسی به محتویات متغییر GLOBAL وجد نداره.


سوال اینه که: آیا دسترسی به متغییر GLOBAL محدودیت داره؟ چطور میشه که متغییر GLOBAL که در کلاسهای مختلف مورد استفاده قرار میگیرد نیاز به تعریف مجدد ندارند ولی محتوی آنها در بعضی موارد برابر با صفر میشه.
اگه متغییری در یک کلاس شناسایی نشه کامپایلر ایراد میگیره. ولی این مشکل پیش نمیاد بلکه متغییر GLOBAL در همه جای برنامه وجود داره ولی مقدار عددی اون در بعضی از کلاسها غیر قابل دسترسی میشه و عدد صفر رو برمیگردونه ؟!؟!؟

لطفا اگه مرجع خوبی برای مطالعه در رابطه با متغییرها در VISUAL C++2005 میشناسید به من معرفی کنید.

با سپاس

saeid5977
جمعه 11 خرداد 1386, 01:31 صبح
تا بحال چنین مشکلی رو ندیده بودم امکان داره کدت رو برامون بفرستی؟