PDA

View Full Version : سوال: تعریف یک کلاس گلوبال در ام اف سی



BeginnerProgrammer
شنبه 09 مرداد 1389, 15:18 عصر
سلام

من میخوام یه کلاس گلوبال تعریف کنیم که بتونم تویه توابع کلاسهای دیگه به این کلاس دسترسی داشته باشم. وقتی برای اینکار مینویسم extern classname a; خطای زیر رو میگیره

unresolved external symbol "class classname a

لطفا کمک کنید.
با تشکر

Nima_NF
شنبه 09 مرداد 1389, 16:52 عصر
برای کلاس ها نیاز نیست از کلمه کلیدی extern استفاده کنید، فقط هدر فایل کلاس را در فایل .h تعریف کنید و در فایل Cpp مورد نظر آن را include کنید. سپس مستقیم استفاده کنید در کل همان فایل قابل شناسایی هست.

اگر جایی در خود همان فایل بعدا تعریف کلاس انجام شده است، فقط در آن حالت برای اینکه به کدهای اول بفهمانید که بعدا تعریف شده است، این طوری تعریفی انجام دهید (بدون extern):



class mydefClass;

// use mydefClass

// define mydefClass

BeginnerProgrammer
شنبه 09 مرداد 1389, 18:03 عصر
ممنون از راهنماییتون
ولی من نمیخوام اینجوری از کلاس گلوبالم استفاده کنم. من h. این کلاس رو تویه کلاس دیگه اینکلود کردم ، یه شی ام از کلاسی که میخوام گلوبال باشه تعریف کردم حالا میخوام تو کلاس دیگه به این شی دسترسی داشته باشم. ولی نمیدونم چه طوری باید این کار رو انجام بدم.

Nima_NF
یک شنبه 10 مرداد 1389, 01:30 صبح
لطفا با یک مثال کوتاه قالب کلاس ها و تعریف مورد نظر را بنویسید تا متوجه منظور شما بشم.

BeginnerProgrammer
یک شنبه 10 مرداد 1389, 10:08 صبح
من کلاس A رو به صورت زیر تعریف کردم


class A{
public:
A(){}
}
و اینم h. کلاس B :

class B{
public:
void readData();
}
اینم B.CPP

#include "B.h"
#include "A.h"
void b::readData(){
A aa;
}
من میخوام aa رو داخل کلاس دیگه ای استفاده کنم. ولی نمیدونم چطوری باید aa رو تعریف کنم؟
لطفا راهنمایی کنید

Nima_NF
یک شنبه 10 مرداد 1389, 14:42 عصر
اولین سوال این هست که چرا کلاس های دیگر باید از این کلاس دلاخل یکی از توابع خود یک شئی بسازند و سپس در اختیار همه قرار دهند؟

شما باید آن ها را شکل عضو داده ای تعریف کنید و سپس با استفاده از یک تابع مانند getxx آن را در اختیار سایر کلاس ها و توابع قرار دهید.

تعریف عمومی یک عضو، کپسوله سازی را بر هم می زند و کار درستی نیست.

برای مثال:



class A
{
public:
A(){ }
void prt(){ cout<<"prt"; }
};
=================
class B
{
public:
void readData();
A getaa() { return aa; }

private:
A aa;
};
=================
void B::readData()
{
aa.prt(); // use aa directly in B
}
=================
class C
{
public:
void readData2();
};
=================
void C::readData2()
{
B b;
A a2 = b.getaa(); // use aa indirectly in other classes
}

در مثال فوق کلاس B مستقیم به A دسترسی دارد، چون عضو داده ای آن هست.
اما در سایر کلاس ها، کافیست یک شیئ از B تعریف کنید و از تابع getaa استفاده کنید تا یک نسخه از آن عضو داده ای دریافت کنید.

تذکر 1: معمولا از اشاره ها برای این گونه موارد استفاده می شود، کنترل حافظه نیر باید در نظر گرفته شود و ... که برای سادگی این کارها انجام نشد.
تذکر 2: اگر قرار هست عضو aa شما در همه جا یکی باشد باید به شکل reference دریافت کنید تا تغییرات روی آن اعمال شود، سپس حتما باید b B را خارج از readData2 تعریف کنید تا یکی نسخه تعریف شود و در دسترس همه کلاس های دیگر قرار گیرد مانند زیر:



int main()
{

B b;
// ....
}



ضمنا شما امکان تعریف یک کلاس به شکل مشتق را نیز دارید، می توانید سایر کلاس ها را مشتق B تعریف کنید تا به توابع آن مستقیم دسترسی داشته باشید. (به عضو داده ای فقط با getaa یا وقتی عضو داده ای protected باشد)

BeginnerProgrammer
یک شنبه 10 مرداد 1389, 15:18 عصر
برنامه من با ام اف سیه ، و کلاس B در واقع یه کلاس پایه س که همه ی کلاسا ازش ارث بری کردن و یک سری توابع ویرچوال داره که فقط مقادیرو set و get می کنن که خود توابعی که این مقادیر رو محاسبه می کنن داخل کلاسهایی(حدود 20 تا کلاس ) مثل A است .
و تویه کلاسی مثل کلاس c که خودش یه دیالوگ جداس میخوام یه سری مقادیر بگیرم که این مقادیر باعث تغییراتی در مقدار متغییرهایی که توابع کلاس B ست یا گت میکنن میشه برای همین من باید به شی که تویه کلاس B از نوع کلاس A درست کردم دسترسی داشته باشم تا محاسبات رو دوباره روی این مقادیر جدید انجام بده( شی که از نوع کلاس A داخل کلاس B هست رو تویه یه تابع تعریف کردم، که اگه بخوام طبق چیزی که شما گفتین عمل کنم خیلی کدم طولانی میشه چون باید حدود 20 تابع دیگه برای get کردن کلاسهام اضافه کنم).
با تشکر فراوان