مشاهدة النتائج 1 الى 4 من 4
  1. #1

    خطأ منطقي قاتل في لغة البرمجة سي ++

    السلام عليكم إخواني أخواتي، رمضان كريم كله مغفرة وأجر وثواب إن شاء الله.

    السي ++ لغة برمجة قوية لا يسعنا ذكر ميزاتها لذلك ندخل مباشرة في صلب الموضوع:

    نفترض أنّ الكلاس Point تم تصريحها في كلا الملفين Point.h و Point.cpp
    ملفين الواجه والتنفيذ في المرفقات مع الملف الرئيسي.

    لاحظ السطر رقم 10:
    Point p3();

    هنا يكمن الخطأ المنطقي وهو: الإعتقاد أنّ التصريح بمعرف كائن متبوع بقوسين فارغين يستدعي المصمم الإفتراضي ( default constructor ) للكلاس.

    هنا القوسين هما تابعان للمعرف أي p3() هو اسم الكائن ويمكنك إستدعاء الدالة getX() على سبيل المثال كالتالي:
    p3().getX();
    إذا فالكتابة p3.getX() تعتبر خطأ كتابة وتجد مترجم مايكروسوفت visual c++ 2010 express يصدر التالي:
    [error C2228: left of '.getX' must have class/struct/union
    error C2065: 'p3' : undeclared identifier

    وأيضا اجتنب المعرفات المتبوعة بالقوسين لأنّ استدعاء الدوال ( functions ) بها قد يؤدي إلى أخطاء وقت التنفيذ والله أعلم.

    والسلام عليكم.

    أخوكم إلياس.


  2. ...

  3. #2
    عضو موقوف









    مقالات المدونة
    10

    مسابقة قضايا مجتمعنا مسابقة قضايا مجتمعنا
    مسابقة الفرسان الثلاثة مسابقة الفرسان الثلاثة
    مراقب متميّز مراقب متميّز
    مشاهدة البقية
    يُنقل للقسم المناسب

  4. #3
    إقتباس الرسالة الأصلية كتبت بواسطة قيس الزمان مشاهدة المشاركة
    السلام عليكم إخواني أخواتي، رمضان كريم كله مغفرة وأجر وثواب إن شاء الله.
    ...
    لاحظ السطر رقم 10:
    Point p3();

    هنا يكمن الخطأ المنطقي وهو: الإعتقاد أنّ التصريح بمعرف كائن متبوع بقوسين فارغين يستدعي المصمم الإفتراضي ( default constructor ) للكلاس.

    هنا القوسين هما تابعان للمعرف أي p3() هو اسم الكائن ويمكنك إستدعاء الدالة getX() على سبيل المثال كالتالي:
    p3().getX();
    إذا فالكتابة p3.getX() تعتبر خطأ كتابة وتجد مترجم مايكروسوفت visual c++ 2010 express يصدر التالي:
    [error C2228: left of '.getX' must have class/struct/union
    error C2065: 'p3' : undeclared identifier

    وأيضا اجتنب المعرفات المتبوعة بالقوسين لأنّ استدعاء الدوال ( functions ) بها قد يؤدي إلى أخطاء وقت التنفيذ والله أعلم.

    والسلام عليكم.

    أخوكم إلياس.
    وعليكم السلام ورحمة الله وبركاته

    رمضان مبارك علينا وعليكم،

    شكراً على هذه الملحوظة القيمة gooood

    لكن لدي تعديل على ما قلته:
    في الحقيقة السطر رقم 10 يقوم بالتصريح عن نموذج مبدأي (Prototype) لدالة (Function) تسمى p3 لا تأخذ بارامترات (Parameters)،
    أي أن p3 تم تعريفها كدالة تعيد قيمة من نوع Point وليست متغيراً من نوع Point حيث أنه من غير الممكن أن تكون الأقواس جزءا من اسم المتغير!

    لمزيد من المعلومات عن الـ Function Prototype راجع الفقرة Declaring functions في الرابط التالي قمتُ بتعديل الدالة main لتوضيح الصورة أكثر:

    كود الـ PHP:
    #include <iostream>
    using namespace std;

    #include "Point.h"

    int main()
    {
        
    Point p11215 );
        
    Point p2;
        
        
    // declare function prototype for function 'p3' that takes no parameters and returns 'Point' object
        
    Point p3();

        
    // declare function prototype for function 'p4' that takes 3 (int) parameters and returns 'Point' Object
        
    Point p4(intintint);

        
    // this calls 'p3' function
        
    p3();

        
    // this calls 'p3' function and call 'getX' method from the returned object which returns the 'x' value (1000)
        
    p3().getX();

        
    cout << "p1: x = " << p1.getX() << "; y = " << p1.getY()
            << 
    endl;
        
    cout << "p2: x = " << p2.getX() << "; y = " << p2.getY()
            << 
    endl;

        
    /* this was commented because p3 is not a variable, it is 'Function'!!
        cout << "p3: x = " << p3.getX() << "; y = " << p3.getY()
            << endl;
        */

        
    system"pause" );
    // end main

    // p3 defenition
    Point p3()
    {
        static 
    int i=0;
        if (
    i==0)
        {
            
    i++;
            
    cout << "***********************************\n";
            
    cout << "Hello there!\t This is p3 function.\n";
            
    cout << "***********************************\n";
        }
        
        return 
    Point(10001000);
    }

    // p4 defenition
    Point p4 (int iint jint k)
    {
        return 
    Point (i*jj*k);

    فقط للتأكيد: من غير الممكن أن يحتوي اسم المتغير على أقواس ()

    شكراً مرة أخرى على هذه الملحوظة،
    تحياتي
    اخر تعديل كان بواسطة » Diamond mas في يوم » 18-08-2011 عند الساعة » 08:40
    سبحانك اللهم وبحمدك أشهد أن لا إله إلا أنت، أستغفرك ربي وأتوب إليك

  5. #4

بيانات عن الموضوع

الأعضاء الذين يشاهدون هذا الموضوع

عدد زوار الموضوع الآن 1 . (0 عضو و 1 ضيف)

المفضلات

collapse_40b قوانين المشاركة

  • غير مصرّح لك بنشر موضوع جديد
  • غير مصرّح بالرد على المواضيع
  • غير مصرّح لك بإرفاق ملفات
  • غير مصرّح لك بتعديل مشاركاتك
  •  

مكسات على ايفون  مكسات على اندرويد  Rss  Facebook  Twitter