رفتن به مطلب
مرجع رسمی سی‌پلاس‌پلاس ایران

CISCO

کاربـــر عـــــادی
  • تعداد ارسال ها

    4
  • تاریخ عضویت

  • آخرین بازدید

پست ها ارسال شده توسط CISCO


  1. یه سوال داشتم  که خیلی وقت هست درگیرش هستم.
    من خودم به صورت عادی از win32 در ++C استفاده میکنم و برای ساختن حتی یه button کلی زور میزنم و کد مینویسم برای رویداد ها و لوکیشن و ...

    حالا بماند که برای تنظیم یک رنگ برای یک button یا text چقدرر دردسر دارم.

    من قبلا با زبان #C کار میکردم و با رابط گرافیکی و طراحی رابط گرافیکی اون به خوبی آشنا هستم . البته میدونم که امنیت برنامه های .net کلا ضعیف هست اما  از لحاظ گرافیکی به راحتی میشه هر نوعی که بخوایم در کمترین زمان طراحی کنیم. البته اگر بخوایم باز کد ها و دستورات رو با .net بنویسیم چیز جالبی نمیشه.

    البته نا گفته نماند که به Qt ام برای طراحی فکر کردم اما چند تا مشکل دارد . اولی اینکه حجم برنامه رو به شدت میبره بالا . دوم تعداد فایل های برنامه رو میبره بالا . سوم من در کل IDE برنامه نویسیم در Visual studio هست و به اون بیشتر عادت دارم چون خیلی ساده تر هست نسبت به Qt و اگر بخوام پلاگین های qt رو بریزم توی vs باز هم باید به صورت کد و لوکیشن و ... انجام بدم که تقریبا مثل win32 میشه فکر کنم. 

    من خودم شخصا برای این مشکل به این فکر افتادم که رابط گرافیکی رو با c# بنویسم و همه کد ها رو توی یه قالب dll که به زبان c++ نوشته شده از #C فراخانی کنم. 

    نظر شما چیه؟ راه حل بهتری سراغ دارید؟

    • پسندیدن 2

  2. در 7 ساعت قبل، قاسم رمضانی منش گفته است :

    علیکم‌السلام.

    قبل از اینکه به پاسخ مستقیم سؤال بپردازیم ، بیاید درک کنیم چه شد که template ها نیاز برنامه‌نویس شد.

    این تابع را در نظر بگیر :

    
    
     
     
    int Sum (const int& first, const int& second){
     
    return first+second;
     
    }

    این تابع دو عدد از نوع int دریافت و حاصل جمع‌شون را بر می‌گردونه.

    خب ! حالا چه میشه اگه شما بخواید به جای int نوع double ارسال کنید ؟ و برنامهٔ شما با انواع مختلفی داده نیاز داشته باشه که با این تابع کار کنه. شاید بگید خب یک تابع دیگه با پارامتر و نوع بازگشتی double می‌نویسم.

    با این روش چه مشکلاتی پیش می‌آید :

    • کد تکراری.
    • بالا رفتن درصد خطای کد.
    • افزایش بی‌دلیل حجم کد.
    • سخت شدن مدیریت کد.
    • مشکل در آپدیت کردن سورس کد.
    • و ...

    زبان سی‌پلاس‌پلاس برای رفع این مشکل‌ما template ها را معرفی کرده است. template ها می‌توانند هر نوع داده‌ای را قبول کنن. تابع زیر ، تابع template بازنویسی شدهٔ تابع Sum است که در مثال بالا نوشتیم  :

    
    
     
     
    template <typename newType> newType Sum (const newType& first, const newType& second){
     
    return first + second;
     
    }

    ???خییییلی بزرگ شد ن ؟. خب می‌تونیم کوتاهش کنیم :

    
    
     
     
    template <typename newType>
     
    newType
     
    Sum (const newType& first, const newType& second){
     
    return first + second;
     
    }
    • نکته : می‌دانیم که کامپایلر فاصله‌هارا نادیده می‌گیره

    خب ! اوّل برای تبدیل تابع ، به یک تابع template باید از کلمهٔ کلیدی template استفاده کنیم. و بعد با استفاده از < > اسم نوع داده‌های جدیدمان را بنویسیم.

    • نکته : ما هیچ نوع دادهٔ جدیدی درواقع تعریف نمی‌کنیم. این تعریف فقط معرفی یک اسم به عنوان نوع داده‌ای هست که می‌تواند به هر چیزی اعم از int,double ,... تبدیل بشود.

    و داخل < > ما از کلمهٔ‌کلیدی typename برای تعریف اسم داده‌‌ استفاده کردیم. و همچنین می‌توانیم کلمهٔ‌کلیدی class نیز استفاده کنیم که هردو برابر یک دیگر هستن. امّا زمانی شما دارید templateی از template درست می‌کنید. مثلاً این نمونه :

    
    template < template <typename> class MyTmpClass, typename newType>

    اینجا دیگه نمی‌توانید بین کلمه‌کلیدی typename و class تفاوت قائع نشید. چرا که نیازه صراحتاً مشخص. امّا در استاندارد ۱۷ این مشکل وجود ندارد  ِ؛ ولی بهتر است که این تفاوت را اعمال کنیم.

    حال به راحتی می‌توانیم تابع را فراخوانی کنیم. به تکه کدزیر توجه کنید

    
    
     
     
    Sum (12 ,32);
     
    Sum (1'000'000'000'000,3212'333'233);
     
    Sum (std::string("ghasem") , std::string("ramezani"));
     
    Sum (12, 32.0);

    سه خط اوّل کد بدون مشکل کامپایل می‌شوند. الا خط ‌آخری. چرا که ما یک پارامتر با نوع int و یک پارامتر با نوع double‌ ارسال کردیم.

    برای حل این مشکل بیاید ببینیم که template ها به چه صورت کار می‌کنند. فرض کنید این تابع را فراخوانی کردیم :

    
    Sum ( int , int );

    وقتی کامپایلر به این تابع بر می‌خورد. تابع template مارا به این‌صورت برای ما بازنویسی می‌کند :

    
    
     
     
    int
     
    Sum (const int& first, const int& second){
     
    return first + second;
     
    }

    خب ! و وقتیما سعی می‌کنیم این تابع را فراخوانی کنیم :

    
    Sum ( int , double );

    برنامه کامپایل نمی‌شود و خطای زیر را ساطع میکنن. چرا که یک پارامتر Int و دیگری double هست. 

    
    ./main.cpp:5: candidate template ignored: deduced conflicting types for parameter 'newType' ('int' vs. 'double')

     

    آیا این شکل استفاده از توابع براتون آشنا نیست ؟ یه کم فک کنید :

    • std::vector
    • std::array
    • std::list

    تمام این کلاس‌ها ، template class هستند. و هر نوعی می‌توانند قبول کنند :

    
    
     
     
    #include <vector>
     
    #include <string>
     
     
     
    class myClass{
     
    public:
     
    myClass(){}
     
    };
     
     
     
    int main (void){
     
    std::vector <int> myIntger {1,2,3,4};
     
    std::vector <std::string> myString {"ghasem" , "ramezani"};
     
    std::vector <myClass> myClassVector;
     
     
     
    return 0;
     
    }

     

    این توضیح خیلی خلاصه از template ها و روش استفاده از آنها بود و به همین دو خط محدود نمی‌شوند.

     

    و اینکه گفتید "به نظر پیچیده می‌باشد" ?. پیچیدگی در عین سادگی یکی از قابلیت‌های فوق‌العادهٔ زبان سی‌پلاس‌پلاسه?. اصلاً کد باید وحشت‌ناک باشه.?

     

     

    بسیار ممنون از پاسخ مفید و ععال شما !?

    • پسندیدن 1

  3. با سلام , امروز در حال گشتن توی یک سایت به عبارت template برخورد کردم‌. بعد از کمی گشتن در اینترنت تا حدودی فهمیدم که این عبارت برای ++C می‌باشد ولی از آنجا که به نظر پیچیده می‌باشد از دوستان خواهشمندم توضیحی درباره این موضوع با یک مثال بدهند تا هم من و هم بقیه از این روش اطلاع داشته باشیم.

×
×
  • جدید...