سؤال

أنا أعمل على التعليمات البرمجية التي لا أقرب الجار الاستعلامات.هناك نوعان من الأفكار البسيطة التي تكمن وراء كيف يمكن للمستخدم الاستعلام عن البيانات في البحث:

  • أقرب N نقطة إلى نقطة معينة في الفضاء.
  • كل نقطة ضمن مسافة معينة.

في قانون بلدي, نقطة توضع في PointList ، PointList هو وعاء يحتوي على وظيفة تتبع النقاط التي تم العثور عليها في البحث.

الآن بلدي PointList كائن منشئ واحد:

PointList( unsigned int maxvals ); // #1

المقبلين المنشئات التي أود إضافة هذه:

PointList( float maxdist ); // #2
PointList( unsigned int maxvals, float maxdist ); // #3

سؤالي هو:كيف يمكنني التأكد من مستخدمي برنامج التحويل البرمجي C++ سوف تولد الحق منشئ عن PointList و يميز بين الصانعين 1 و 2?يجب أن تنفذ #3 وتوفير الثوابت التي تحدد التعسفي كبيرة قيم maxvals و maxdist?بديل آخر يمكن كتابة نظام آخر من خفيفة الوزن الكائنات التي تحكم منطق إضافة نقاط إلى القائمة ، ولكن أن يشعر وكأنه مبالغة هذه فكرة بسيطة.

أنا حقا أحاول أن أجعل هذا شفافة بالنسبة للمستخدمين الذين هم في الغالب من العلماء الذين تعلموا C++ في بعض الأحيان دون الاستفادة من التعليم الرسمي.وذلك بفضل!

هل كانت مفيدة؟

المحلول

الزائد القرار صحيح أنواع يحدث على فئتين يمكن تلخيص ما يقرب إلى

  • الترويج:هذا هو التحويل من أنواع أصغر من int إلى int أو unsigned int, اعتمادا على ما إذا كان int يمكن تخزين كل القيم من نوع المصدر.
  • التحويل:هذا هو التحويل من أي عدد صحيح من نوع إلى آخر من نوع عدد صحيح.

مماثلة, تحويل النقطة العائمة أنواع يحدث على فئتين

  • الترويج:هذا هو التحويل من float إلى double
  • التحويل:هذا هو التحويل من أي النقطة العائمة نوع إلى آخر نقطة عائمة نوع

وهناك التحويل من عدد صحيح إلى العائمة أو الظهر.هذه المرتبة التحويل بدلا من الترويج.ترقية المرتبة أفضل من التحويل ، حيث فقط هناك حاجة إلى تعزيز هذا الحالة سيكون من المفضل.وهكذا, يمكنك استخدام ما يلي المنشئات

PointList( int maxVals );
PointList( unsigned int maxVals );
PointList( long maxVals );
PointList( unsigned long maxVals );

PointList( double maxDist );
PointList( long double maxDist );

أي نوع عدد صحيح ، وهذا اختيار المجموعة الأولى من البناء.وعلى أي النقطة العائمة نوع هذا يجب تحديد المجموعة الثانية من المنشئات.الأصلي الخاص بك اثنين من منشئات يمكن أن يؤدي بسهولة في حالة من الالتباس بين float و unsigned int, إذا كنت تمر int, على سبيل المثال.الأخرى ، وهما حجة منشئ, يمكنك الذهاب مع الحل الخاص بك إذا كنت تريد.


أن قال, وأود أن استخدام مصنع وظيفة أيضا ، لأن اتخاذ قرار بشأن نوع معنى المعلمة هي هشة جدا على ما أعتقد.معظم الناس تتوقع النتيجة التالية متساوية

PointList p(floor(1.5));
PointList u((int)1.5);

ولكن ذلك من شأنه أن يؤدي في مختلف شؤون الدولة.

نصائح أخرى

لماذا لا تستخدم أساليب المصنع بدلا من البنائون ؟ مصنع طرق الاستفادة من تخصيص أسماء.


static PointList createNearestValues(unsigned int maxvals) {}
static PointList createByDistance(float maxdist) {}

النظر في استخدام صحيح typedefs.انها أكثر من ذلك بقليل من الجهد على الجزء الخاص بك رمز العميل ، ولكن كنت يضمن لك صحة.

دعوة PointList(10) الأول PointList(10f) للمرة الثانية.

الثانية, يمكنك أيضا استخدام 10.0.

إذا منشئات #1 و #2 موجودة الصحيح منشئ سوف يطلق إذا كانت قيمة إدراج هو تعويم أو الباحث و لا التحويل يجب أن تأخذ مكان.حتى مجرد التأكد من أن تقوم أنواع من الأرقام يمكنك استخدام دعوة صريحة (أي1f 1).منشئ #3 لا يبدو أن يكون خيارا كما أنه ليس من الضروري حقا أن مجرد الخلط بين المستخدمين من التعليمات البرمجية الخاصة بك.إذا كنت بحاجة إلى القيم الافتراضية لأي عدد يمكن استخدام

PointList(int max, float max=VALUE)

و

PointList(float max, int max=VALUE)

مرة أخرى:هذا ويبدو أن تفعل المزيد من الضرر ثم رمز من حيث مقروئية.

هذا هو الدعوة إلى القراءة الجيدة على الزائد القرار.

أنا بالتأكيد سوف تستخدم صراحة المنشئات.في المثال غير صحيح لا تحويل ضمنا.

class A
{
public:
    explicit A(float f){}
    explicit A(int i){}
};

void test(){
    unsigned int uinteger(0);
    A a1(uinteger);        //Fails, does not allow implicit conversions

    A a2((float)uinteger); //OK, explicit conversion

    float f(0.0);
    A a3(f);               //OK

    int integer(0);
    A a4(integer);         //OK
}

رسالة الخطأ من السهل بما فيه الكفاية لفهم:

: error C2668: 'A::A' : ambiguous call to overloaded function
: could be 'A::A(int)'
: or       'A::A(float)'
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top