PDA

View Full Version : نحوه ی export کردن تابع و کلاس template



asdasd123123
شنبه 19 بهمن 1392, 12:50 عصر
سلام دوستان من می خوام کلاس یا تابع template رو در فایل مجزای cpp (نه هیدر) تعریف کنم جایی خوندم باید از کلمه export استفاده کرد ولی مثالی نزده بود میشه یه مثال بزنید ممنون.

rahnema1
شنبه 19 بهمن 1392, 22:43 عصر
سلام
کلمه export برای استفاده های بعدی رزرو شده و هنوز کارایی نداره
سه تا فایل داریم یکی فایل Mian و دو تا دیگه هم اعلان و تعریف تمپلیت تابع
اگرچه پسوند فایل twice.cpp حرف h نیست ولی در واقع اون یک هیدره


//twice.h
#ifndef TWICE_H
#define TWICE_H
template <class Number>
Number twice(Number original);
#endif TWICE_H

//twice.cpp//twice.cpp
template <class Number>
Number twice( Number original )
{
return original + original;
}

//main.cpp
#include "twice.cpp"
#include <iostream>
using namespace std;
int main( )
{
cout<< twice<int>( -3 );
return 0;
}




http://docs.oracle.com/cd/E19205-01/819-5267/bkaeu/index.html

مصطفی ساتکی
یک شنبه 20 بهمن 1392, 19:07 عصر
سلام دوستان من می خوام کلاس یا تابع template رو در فایل مجزای cpp (نه هیدر) تعریف کنم جایی خوندم باید از کلمه export استفاده کرد ولی مثالی نزده بود میشه یه مثال بزنید ممنون.
امکانش وجود داره ولی باید signature را با نوع در سورس تعریف کنید. برای اطلاعات بیشتر این پست (http://www.7khatcode.com/1509/%D8%AA%D8%B9%D8%B1%DB%8C%D9%81-%D8%AA%D8%A7%D8%A8%D8%B9%DB%8C-%D8%A8%D9%87-%D8%B5%D9%88%D8%B1%D8%AA-template-%D9%87%D9%85-%D8%AF%D8%B1-source-%D9%88-%D9%87%D9%85-%D8%AF%D8%B1-header) را مطالعه کنید.



سلام
کلمه export برای استفاده های بعدی رزرو شده و هنوز کارایی نداره
سه تا فایل داریم یکی فایل Mian و دو تا دیگه هم اعلان و تعریف تمپلیت تابع
اگرچه پسوند فایل twice.cpp حرف h نیست ولی در واقع اون یک هیدره


//twice.h
#ifndef TWICE_H
#define TWICE_H
template <class Number>
Number twice(Number original);
#endif TWICE_H

//twice.cpp//twice.cpp
template <class Number>
Number twice( Number original )
{
return original + original;
}

//main.cpp
#include "twice.cpp"
#include <iostream>
using namespace std;
int main( )
{
cout<< twice<int>( -3 );
return 0;
}




http://docs.oracle.com/cd/E19205-01/819-5267/bkaeu/index.html

دوست عزیر کدی را که قرار میدید حداقل یکبار تست کنید.

rahnema1
یک شنبه 20 بهمن 1392, 20:04 عصر
امکانش وجود داره ولی باید signature را با نوع در سورس تعریف کنید. برای اطلاعات بیشتر این پست (http://www.7khatcode.com/1509/%D8%AA%D8%B9%D8%B1%DB%8C%D9%81-%D8%AA%D8%A7%D8%A8%D8%B9%DB%8C-%D8%A8%D9%87-%D8%B5%D9%88%D8%B1%D8%AA-template-%D9%87%D9%85-%D8%AF%D8%B1-source-%D9%88-%D9%87%D9%85-%D8%AF%D8%B1-header) را مطالعه کنید.




دوست عزیر کدی را که قرار میدید حداقل یکبار تست کنید.

لینکی در انتهای پست را گذاشتم مربوط به یک صفحه بعد از اون مطلب مورد نظر بود و در سایت Oracle هست اگر از کامپایلر Sun Studio 12: C++‎‎ اینجوری میشه انجام داد . همه کامپایلر ها جدا کردن تعریف و اعلان را در دو فایل نمی پذیرند اگه بتونید شما در همین کامپایلری که اشاره کردم تست کنید در ادامه عین مثالی که در همون سایت هست را میذارم


twice.h


#ifndef TWICE_H
#define TWICE_H
template <class Number>
Number twice(Number original);
#endif TWICE_H
twice.cc


template <class Number>
Number twice( Number original )
{ return original + original; }
main.cc


#include “twice.h”
int main( )
{ return twice<int>( -3 ); }



http://docs.oracle.com/cd/E19205-01/819-5267/bkaev/index.html

مصطفی ساتکی
یک شنبه 20 بهمن 1392, 21:39 عصر
ما چرا c++ کار می کنیم؟ به خاطر performance .
این کامپایلر اصلا مثل کامپایلرهای دیگه optimize نیست ثانیا gcc آخرین استاندارد ها رو داره . در ضمن شما بایستی حتما اسم سورس رو هم نام بدید و هیچ چیز دیگری توش تعریف نکنید.

asdasd123123
دوشنبه 21 بهمن 1392, 12:10 عصر
.
.
.

یه سوال دیگه: inline کردن namespace آیا به معنی inline کردن تمام توابع داخل اونه یا مفهوم دیگه ای دارد؟

rahnema1
چهارشنبه 23 بهمن 1392, 10:48 صبح
inline کردن namespace باعث میشه تمام اعضای اون در namespace بالاتر از اون مستقیما در دسترس قرار بگیرند یعنی اگه ما در در namespace بالاتر از یک namespace از نوع inline باشیم دیگه نیازی نیست برای دسترسی به اعضای اون namespace از نوع inline از کلمه using و یا :: استفاده کنیم و با مفهوم inline کردن تابع متفاوته
مثلا در این مثال برای دسترسی به متغیر a از namespace inline دو گونه می تونیم عمل کنیم یا مستقیما دسترسی پیدا کنیم و یا با ::

#include <iostream>
namespace bala
{
inline namespace pain1
{
int a=7;
}
namespace pain2
{
int a=8;
}
}
int main()
{
cout<<bala::a;
cout<<bala::pain1::a;
cout<<bala::pain2::a;
}

asdasd123123
شنبه 26 بهمن 1392, 06:17 صبح
ممنون فهمیدم.