PDA

View Full Version : سوال: این تابع عضو کلاس نمی باشد !؟



A.S.Roma
چهارشنبه 19 تیر 1387, 23:42 عصر
سلام

دارم یه برنامه می نویسم که توش کلی کلاس و ... داره !
امشب به یه مشکل عجیب بر خوردم .یکی از توابه کلاس A با توجه به وضعیت Property های شی ای از کلاس دیگر ( B ) باید تصمیم گیری کند .
من نیز شی کلاس B را به صورت پارامتر به تابه کلاس A پاس کردم . در کلاس B یک تابع Accessor در نظر گرفتم تا مقدار property مورد نظر را برگرداند. اما هنگامی که در تابع کلاس A آن را Call می کنم کامپایلر Error می گیرد که :

Func1 Is not The Member Of Class A !

واقعا نمی دونم برای چی Error میگیرد !؟

اومدم کلاس ها را دوست تعریف کردم که به Property های هم دسترسی داشته باشن بازم صداش در اومد ! کارم هم گرافیکی هست و فقط باید از Turbi C++ 3.0 استفاده کنم .

ممنون میشم کمکم کنید !

mic_makarti
پنج شنبه 20 تیر 1387, 13:08 عصر
سلام یه تیکه از کد بزار ببینیم چیه !!!!

A.S.Roma
پنج شنبه 20 تیر 1387, 14:30 عصر
سلام

این کلاس Interface :


class Interface
{
Rect *t;
Ellipse *e;
int tEnable;
int eEnable;
public:
Interface();
void Move(char dir);
void EnableRect();
void EnableEllipse();
char MakeDir();
int GetTEnable(){return tEnable;}
int GetEEnable(){return eEnable;}
// friend class Curser;
};
اینم کلاس Curser :


class Curser
{
protected:
int x,y;
int enter;
public:
Curser(int nx,int ny);
void Draw();
void Move(char dir);
char MakeDir();
void Enter();
int Getx();
int Gety();
int GetEntered(){return enter;}
void PutRect();
void PutEllipse();
void Identify(Interface itf);
};
و این هم تابع Identify :


void Curser::Identify(Interface itf)
{
if(itf.GetEEnable())
PutEllipse();
else if(itf.GetTEnable())
PutRect();
}
موقع کامپایل Error می گیرد که :
GetEEnable Is not the member of Interface
GetTEnable is not the member of Interface

Nima_NF
پنج شنبه 20 تیر 1387, 17:48 عصر
دقت کنید که کلاس Interface در بالای کلاس Curser تعریف شده باشد، تا توسط سایر کلاس های بعد از آن قابل شناسایی باشد در غیر این صورت این خطا داده می شود.

اگر هم در فایل دیگری تعریف کرده اید، هدر فایل آن حتما در بالای فایل مورد نظر قبل از استفاده باید اضافه شده باشد.

A.S.Roma
پنج شنبه 20 تیر 1387, 22:26 عصر
دقت کنید که کلاس Interface در بالای کلاس Curser تعریف شده باشد، تا توسط سایر کلاس های بعد از آن قابل شناسایی باشد در غیر این صورت این خطا داده می شود.

اگر هم در فایل دیگری تعریف کرده اید، هدر فایل آن حتما در بالای فایل مورد نظر قبل از استفاده باید اضافه شده باشد.

سلام

دقیقا مشکلم همین بود !
اما مگر این طور نیست که اگر من این خط رو بالای کلاس Curser اضافه کنم مشکلم حل میشه !؟ ( اسم این عمل رو یادم نیست چی بود !؟ )


class Interface;


اما اینجوری درست نمیشه ! و فقط باید کل کلاس رو ببرم بالا !

Nima_NF
جمعه 21 تیر 1387, 02:12 صبح
اما مگر این طور نیست که اگر من این خط رو بالای کلاس Curser اضافه کنم مشکلم حل میشه !؟ ( اسم این عمل رو یادم نیست چی بود !؟ )اعلان کلاس به این شکل برای موقعی هست که شما فقط از نام کلاس به عنوان آرگومان یا مانند آن استفاده می کنید، ولی وقتی که به متد های داخلی یا متغیر های آن نیز می خواهید دسترسی داشته باشید برنامه از کجا بفهمد که چه متد هایی داخل آن هست؟ پس باید کل کلاس بالای آن تعریف شود.

برای همین همیشه کلاس ها را در فایل های مختلف تعریف و هدر فایل آن را در بالای فایل های دیگر اضافه می کنند تا منظم تر و کنترل راحت تر باشد.

A.S.Roma
دوشنبه 24 تیر 1387, 22:24 عصر
مرسی از توضیحاتتون ...
نحوه تعریف هدر رو اگر امکان داره برام توضیح بدین چون تا به حال این کار رو نکردم .

ممنون !

Nima_NF
سه شنبه 25 تیر 1387, 00:48 صبح
یکی از کاربران قبلا در لینک زیر توضیحاتی دادند:
ساخت فایل header (http://barnamenevis.org/forum/showthread.php?t=110712)

شما همان قالب کلاس را که در پست سوم قرار دادید در یک فایل با پشوند .h ذخیره کنید:



// test.h

#ifndef TEST_H
#define TEST_H

class Interface
{
// codes here
};

#endif // TEST_H

سپس در فایل دیگری با پسوند .cpp تعاریف کلاس را قرار دهید و فقط بالای آن مسیر هدر فایل را بنویسید:



#include "test.h"

و سپس تعاریف متدهای کلاس و توابع:



// test.cpp

#include "test.h"

void Curser::Identify(Interface itf)
{
// codes here
}