ورود

View Full Version : template و چند تکه بودن برنامه



hercules_3d
یک شنبه 22 مرداد 1385, 14:25 عصر
سلام
کد های زیر رو در نظر بگیرید :
g.h

#ifndef G_H
#define G_H

template < class T >
class Stack {

public :

Stack( int );
~Stack()
{
delete [] stackPtr;

}

private :

int size;
int top;
T *stackPtr;

};


template< class T >
Stack< T >::Stack( int s )
{
size = s > 0 ? s : 10;
top = -1;
stackPtr = new T[ size ];

}
#endif

f.cpp


#include <conio.h>
#include "g.h"
int main()
{
Stack< double > s( 5 );
_getch();
return 0;

}

حالا اگه بخواهم کد اجرایی تابع stack( سازنده) رو در فایل g.cpp بنویسم به این شکل :

#include "g.h"
template< class T >
Stack< T >::Stack( int s )
{
size = s > 0 ? s : 10;
top = -1;
stackPtr = new T[ size ];

}

(البته کد اجرایی تابع stack رو از فایل g.h برداشتم)
چرا برنامه ارور میده البته تا اونجایی که من فهمیدم ارور مربوط به لینک شدنه من همیشه این کارو میکنم یعنی پروتو تایپ توابع کلاس رو توی یه فایل هدر و اجرای توابع رو توی فایل سی پلاس پلاس و خود برنامه ی اصلی رو هم توی فایل سی پلاس پلاس دیگه ای مینویسم
هر چی هست زیر سر این template هستش

Anti_Evil
یک شنبه 22 مرداد 1385, 23:54 عصر
با سلام، (و با عرض پوزش که نمی تونم زیاد بنویسم)

این قضیه داستان درازی داره ...
که هم شدنیه و هم ناشدنی !

بستگی به چندتا پارامتر داره .... اینکه واقعا چقدر اهمیت داره که اینکارو بکنی (چون شاید واقعا نیاز نباشه و شاید واقعا دوست نداشته باشی که یه چیزایی مثل زیبایی کدت رو فدای بازدهی کنی) و دوم کامپایلر !

با اجازت من فقط در مورد قسمت دوم کوتاه عرض کنم که با توجه به اینکه اغلب از کامپایلرهای Borland ی و $M ی استفاده میکنیم (متاسفانه) مجبوری کل بدنه تعریف و پیاده سازی رو یه جا پیاده کنی.

حتما اگه زنده بودم و خدا عمری داد بیشتر توضیح میدم... (گرچه کدت رو درست درمون مطالعه نکردم)

یا علی

sh_roohani
دوشنبه 23 مرداد 1385, 14:55 عصر
سلام،
آقا من همین الان این مسئله رو با gcc هم امتحان کردم. خود کلاس کامپایل می شه. اما کل پروژه لینک نمیشه.
راستش یه جایی (که یادم نمیاد کجا بود) خوندم که جدا بودن اعلان و پیاده سازی کلاسهای template-based توی spec زبان ++C اومده، ولی بسیاری از کامپایلرها به دلیل مشکل بودن پیاده سازی این قابلیت، از پیاده سازی اون صرفنظر کردن و باید حتما کل کد توی یه فایل باشه.
حالا دو تا سوال:
1. آیا این درسته یا خاطرات من نم کشیده و مسئله از اساس چیز دیگه ایه؟
2. اگه درسته، آیا کسی کامپایلری می شناسه که این قابلیت رو پیاده سازی کرده باشه؟

hercules_3d
سه شنبه 24 مرداد 1385, 09:35 صبح
سلام
spec یعنی چی؟
یه نفر میگفت این کار رو تو gcc انجام داده و جواب داده

راستش یه جایی (که یادم نمیاد کجا بود) خوندم که جدا بودن اعلان و پیاده سازی کلاسهای template-based توی spec زبان ++C اومده
میشه فکر کنید اینو کجا خوندین؟

Anti_Evil
سه شنبه 24 مرداد 1385, 09:57 صبح
یه جایی (که یادم نمیاد کجا بود) خوندم که جدا بودن اعلان و پیاده سازی کلاسهای template-based توی spec زبان ++C اومده

بله درسته.


آیا کسی کامپایلری می شناسه که این قابلیت رو پیاده سازی کرده باشه؟

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


یه نفر میگفت این کار رو تو gcc انجام داده و جواب داده

فکر می کنم، به پست قبلیم دقت نکردی، شما میتونی اینکارو تو ++MC و ++BC و GCC هم پیاده سازی کنی ولی پیشنهاد نمیکنم:


شاید واقعا دوست نداشته باشی که یه چیزایی مثل زیبایی کدت رو فدای بازدهی کنی

اگه نظر دقیق منو میپرسی، جواب من اینه: تعریف و پیاده سازی یکجا صورت بگیره.

sh_roohani
سه شنبه 24 مرداد 1385, 11:27 صبح
سلام
spec یعنی چی؟
یه نفر میگفت این کار رو تو gcc انجام داده و جواب داده

میشه فکر کنید اینو کجا خوندین؟ منظورم از spec همون specification بود که با عرض معذرت چون تایپ کردنش یه کم سخت بود خلاصه ش کردم. اگه می دونستم بعدش باید اینهمه توضیح تایپ کنم که تازه خود کلمه هم به صورت کامل توش باشه، خوب از اول خود کلمه رو کامل تایپ می کردم :لبخند:.

در مورد اینکه کجا خوندم هم فکر کردم. یادم نیومد که نوشتم یادم نمیاد.


بله وجود داره، اجازه بدید تو پست بعدی مینویسم ....
فکر می کنم، به پست قبلیم دقت نکردی، شما میتونی اینکارو تو ++MC و ++BC و GCC هم پیاده سازی کنی ولی پیشنهاد نمیکنم:

Anti_Evil جان، ممنون از توضیحتون. اگه ممکنه وقتی خواستین در مورد اون کامپایلر خاص بنویسین، در مورد اینکه چطور می شه توی اون سه تا کامپایلر معروف هم اینکارو پیاده سازی کرد، یه توضیحی بفرمایین. ممنون می شم.

C++Lover
شنبه 28 مرداد 1385, 03:42 صبح
دوست عزیز به قول دوستان این قصه سر دراز دارد.
اما فعلا :
اگه فایل f.cpp رو بصورت زیر تغییر بدید (به خط 3 توجه شود) مشکل تقریبا حل می شه.


#include <conio.h>
#include "g.h"
#include "g.cpp"

int main()
{
Stack< double > s( 5 );
_getch();
return 0;

}



البته خود این اصلاح مشکلاتی دیگه ای بوجود می آره.
در ضمن اگه توضیحات بیشتری خواستی که اصلا چرا این error رو می ده بگو توضیح بدم.