برگزیده های پرشین تولز

بحث مربوط به template

M I N A

کاربر تازه وارد
تاریخ عضویت
26 دسامبر 2005
نوشته‌ها
6
لایک‌ها
0
سلام
من يه سوال داشتم دوستان هركدوم مي تونن لطفآ جواب بدن
چرا نمي توان توابع Template را داخل فايل c.p.p پياده سازي كرد؟
 

programmer

کاربر تازه وارد
تاریخ عضویت
1 نوامبر 2005
نوشته‌ها
85
لایک‌ها
0
چرا نمي توان توابع Template را داخل فايل c.p.p پياده سازي كرد؟

میشه بیشتر توضیح بدین ؟

منظورتون از داخل فایل c.p.p چیه ؟

در ++C به راحتی میتونید از قالب ها (Template ها ) استفاده کنید !!!
 

M I N A

کاربر تازه وارد
تاریخ عضویت
26 دسامبر 2005
نوشته‌ها
6
لایک‌ها
0
به نقل از programmer :
میشه بیشتر توضیح بدین ؟

منظورتون از داخل فایل c.p.p چیه ؟

در ++C به راحتی میتونید از قالب ها (Template ها ) استفاده کنید !!!


نه . گويا به اين راحتي ها نيست
من خودم هم دقيقا نمي دونم ولي
توابع template بايد در فايل هاي h باشند

مثلا
class1.h
template<class T>

درسته و

class1.cpp
template< class T>

error است

مثه اينكه جواب اين سوال بر مي گرده به تفاوت
class template ها و template class ها
شما مي دونين فرق اين دو چيه؟
 

programmer

کاربر تازه وارد
تاریخ عضویت
1 نوامبر 2005
نوشته‌ها
85
لایک‌ها
0
توابع template بايد در فايل هاي h باشند.

این کار لزومی نداره !!!

اگه دقیقآ بگید میخواهید چه کار کنید دوستان هم بهتر میتوانند کمک کنند !

استفاده از قالب برای تعریف توابع :

کد:
#include<iostream.h>
#include<conio.h>
template<class Type>
Type increase(Type x)
{
 x++;
 return x;
}
//-----------------------------//
int main()
{
 clrscr();
 int y=1;
 cout<<increase(y)<<endl;
 float f=1.02;
 cout<<increase(f)<<endl;
 char c='a';
 cout<<increase(c)<<endl;
 getch();
 return 0;
}

استفاده از قالب در تعریف کلاس :

کد:
#include <iostream.h>
#include <conio.h>
template<class type>
class example
{
 public:
  example(void);
  void print(){cout<<'\n'<<x<<endl;};
 private:
  type x;
};
template<class type>
void example<type>::example(void)
{
 x=65;
};
//------------------//
int main()
{
 clrscr();
 example<int> y;
 y.print();
 example<char> c;
 c.print();
 getch();
 return 0;
}
 

M I N A

کاربر تازه وارد
تاریخ عضویت
26 دسامبر 2005
نوشته‌ها
6
لایک‌ها
0
به نقل از programmer :
این کار لزومی نداره !!!

اگه دقیقآ بگید میخواهید چه کار کنید دوستان هم بهتر میتوانند کمک کنند !

من دقيقآ مي خوام جواب سوال امتيازي استادم رو بدم تا به نموره ي آخر ترمم اضافه بشه !!!
متن سوال هم اينه :
چرا نمي توان توابع template را در file cpp پياده سازي كرد؟
براي پيدا كردن جواب اختلاف بين template class و class template ها را بررسي كنيد .


خوب من تفاوت بين template class و class template را پيدا كردم

class template ها template اي هستند كه در header و file cpp تعريف مي كنيم
template class كلاسي است كه compiler موقع تعريف object از class template مي سازه.
و فكر مي كنم جواب سوال بر مي گرده به template class ها . من از توي اينترنت راجع به template class ها
search كردم و يه متني پيدا كردم. اونجا نوشته كه نمي شه template class را داخل فايل cpp پياده سازي كرد
ولي علت را ننوشته:( حالا من اون متني رو كه اي اينترنت گرفتم اينجا مي ذارم . شايد به پيدا
كردن سوال كمك كنه.

C++ Template Classes
Suppose that you are writing a C++ program that requires two stacks--one for integer data and one for string data. You could implement these classes as follows. The implementation below isn't very good (it limits the stack to 100 elements and it does no error checking), but it will serve as an example.

class IntStack {
public:
IntStack() { top = -1; }
void push(int i)
{ st[++top] = i; }
int pop()
{ return st[top--]; }
private:
int top;
int st[100];
};

class StringStack {
public:
StringStack() { top = -1; }
void push(string i)
{ st[++top] = i; }
string pop()
{ return st[top--]; }
private:
int top;
string st[100];
};



The main program would declare and use these stacks as follows:

IntStack ii;
StringStack ss;
ii.push(25);
ss.push("Hello");

Notice that the only difference between these classes (other than the name of the class) is the type of data that's put onto the stack. C++ allows you to define a single, template class to represent a stack of any possible datatype (including a user-defined datatype). The declaration would look like this:

#ifndef STACK_H
#define STACK_H

template <class T>
class Stack {
public:
Stack() { top = -1; }
void push(T i)
{ st[++top] = i; }
T pop()
{ return st[top--]; }
private:
int top;
T st[100];
};


#endif

The T represents the type of stack desired. The main program would declare and use the stacks as follows:

Stack<int> ii;
Stack<string> ss;
ii.push(25);
ss.push("Hello");

There is never an implementation file (*.cpp) for a template class. All of the member functions should be declared in the header file (in this case, table.h). The following shows how the functions for this class would be declared after the declaration of the class.

#ifndef STACK_H
#define STACK_H


template <class T>
class Stack {
public:
Stack();
void push(T i);
T pop();
private:
int top;
T st[100];
};


template <class T>
Stack<T>::Stack()
{
top = -1;
}

template <class T>
void Stack<T>::push(T i)
{
st[++top] = i;
}

template <class T>
T Stack<T>::pop()
{
return st[top--];
}

#endif




--------------------------------------------------------------------------------​
 

programmer

کاربر تازه وارد
تاریخ عضویت
1 نوامبر 2005
نوشته‌ها
85
لایک‌ها
0
من دقيقآ مي خوام جواب سوال امتيازي استادم رو بدم تا به نموره ي آخر ترمم اضافه بشه !!!
=>سوال شما:
چرا نمي توان توابع Template را داخل فايل c.p.p پياده سازي كرد؟

منظور من این بود که درباره سوالتون بیشتر توضیح بدین نه این که ....

در ضمن برای نوشتن متن های انگلیسی یا کد برنامه ها در فروم بهتره از تگ کد (#) استفاده کنید.
 

mahmood-gt2

کاربر تازه وارد
تاریخ عضویت
15 دسامبر 2005
نوشته‌ها
504
لایک‌ها
1
محل سکونت
توی ماشین
آقا من یه کلاس ساده برای درخت توی kdevelop در fedora 5 نوشتم به صورت زیر.

template < class NODETYPE >
class TEST
{
public:
......
struct node {
NODETYPE key_value;
node *left;
node *right;
};

node *function(NODETYPE key);
}


حالا وقتی می خوام تابع رو به شکل زیر تعریف کنم:

template < class NODETYPE >
node TEST< NODETYPE >:: *function(NODETYPE key) // error in this line
{
...
}​

هی می گه:

error: expected constructor, destructor, or type conversion before 'TEST'​


از یکی پرسیدم گفت بجای اون بنویس:

template < class NODETYPE >
TEST< NODETYPE >::node* TEST< NODETYPE >::function(NODETYPE key)
{
...
}​

ولی باز همونو میگه...........چکارش کنم.........توروخدا بگید........

ببخشید که این پرانتز ها یکمی جابجا شدن
 

MahdiΩ

کاربر تازه وارد
تاریخ عضویت
27 ژانویه 2006
نوشته‌ها
324
لایک‌ها
0
اینو امتحان کن :

کد:
template < class NODETYPE >
node* TEST< NODETYPE >::function(NODETYPE key) 
{
...
}
 

mahmood-gt2

کاربر تازه وارد
تاریخ عضویت
15 دسامبر 2005
نوشته‌ها
504
لایک‌ها
1
محل سکونت
توی ماشین
امتحان کردم...باز همونو میگه.
این kdevelop جدیده بعضی از چیز هایی ساده رو نمی فهمه. مثلاً با VC6.0 همینو نوشتم (البته نوع دومی) ارور نداد.

نمی دونم چه جوری حالیش کنم:(
 

Arash_j13

Registered User
تاریخ عضویت
18 فوریه 2005
نوشته‌ها
778
لایک‌ها
2
محل سکونت
مشهد
خب اگه خطا نده باید به استاندارد بودن کامپایلر شک کرد

شما دارید برای constructor کلاس نوع برگشتی نعریف می کنید در حالی که در ANSI c++ این کار غیر مجازه کد رو این طوری بنویسید

کد:
template < class NODETYPE >
TEST< NODETYPE >:: function(NODETYPE key) 
{
...
}
 

MahdiΩ

کاربر تازه وارد
تاریخ عضویت
27 ژانویه 2006
نوشته‌ها
324
لایک‌ها
0
مطمئن هستید تابع function ، سازنده (constructor) کلاس است ؟!

قبلا" به ما میگفتن سازنده کلاس باید همنام کلاس باشه!
 

MahdiΩ

کاربر تازه وارد
تاریخ عضویت
27 ژانویه 2006
نوشته‌ها
324
لایک‌ها
0
در ضمن اگه اینطور بود باید در تعریف اولیه تابع در داخل کلاس خطا میداد !
 

mahmood-gt2

کاربر تازه وارد
تاریخ عضویت
15 دسامبر 2005
نوشته‌ها
504
لایک‌ها
1
محل سکونت
توی ماشین
function همون constructor نیست. من که اصلاً نگفته بودم که تابع function همون constructor برنامس. من گفتم یکی از توابع اون کلاس اسمش function هست.

من مجبور شدم به خاطر این error..... یه ذره کدم رو عوض کنم. بنابراین فعلاً این مشکل یه جورایی حل شد. حالا اگه دوستان راه حلی دارند بفرمایند، شاید توی آینده بدرد من یا بقیه خورد
 

MahdiΩ

کاربر تازه وارد
تاریخ عضویت
27 ژانویه 2006
نوشته‌ها
324
لایک‌ها
0
function همون constructor نیست. من که اصلاً نگفته بودم که تابع function همون constructor برنامس. من گفتم یکی از توابع اون کلاس اسمش function هست.

من با شما نبودم که !
 
بالا