سؤال

وأنا أعلم أنه فكرة جيدة لجعل أكبر قدر من واجهة من فئة غير الأعضاء غير صديق قدر الإمكان، ولقد أدرك ذلك تماما لبلدي 3D الطبقة ناقلات، "Vector3 '، أنا يمكن نقل + =، - = وهلم جرا المشغلين من الطبقة، وترك المنشئات فقط وعامل التعيين نسخة

والسؤال هو: ما ينبغي هذا المشغل تبدو وكأنها؟ رأيت أشكال متعارف عليها من الكثير من المشغلين الآخرين واتبعت نصائحهم، لكنني لم أر أشكال متعارف عليها من هذه الشركات. لقد أعطيت ما أعتقد أنه يجب أن يكون أقل.

والسؤال الثانوي هو: ما هي هذه الشركات حتى يسمى؟ عوامل التعيين الحسابي؟

والرمز (ذات الصلة) قبل:

class Vector3 {
public:
    Vector3& operator+=(const Vector3& rhs);
    float x, y, z;
};

Vector3& Vector3::operator+=(const Vector3 &rhs) {
    x += rhs.x;
    y += rhs.y;
    z += rhs.z;

    return *this;
}

وما كنت تغييره إلى حتى الآن:

class Vector3 {
public:
    float x, y, z;
};

Vector3& operator+=(Vector3& lhs, const Vector3& rhs) {
    lhs.x += rhs.x;
    lhs.y += rhs.y;
    lhs.z += rhs.z;

    return lhs;
}
هل كانت مفيدة؟

المحلول

وماذا لديك تبدو جيدة بالنسبة لي.

وبالمناسبة، عندما تأتي إلى المشغل +، ومن الشائع أن تنفيذ ذلك من حيث + =. (إنشاء نسخة من الطرف الأيسر، ومن ثم استدعاء LHS + = يمين وإرجاع النتيجة)

لا أعرف إذا كنت على علم هذه الحيلة، ولكن منذ كنت قلقا بشأن طرق متعارف عليها لتنفيذ هذه العوامل، فإنه لا يمكن أن يصب على ذكره. :)

نصائح أخرى

وماذا لديك تبدو جيدة.

والطريقة الأساسية للتفكير في ذلك، بداهة، هو أن نفكر في ما كنت ترغب كود لتبدو وكأنها عند كتابته. إذا، في هذه الحالة، يمكنك كتابة

Vector v, w;

v += w;
w += v;

ووهلم جرا، وكنت على الطريق الصحيح.

وهناك الكثير من قواعد جيدة من الإبهام للمساعدة. يمكنك الاطلاع على هذا الموضوع في ++ C التعليمات من أجل الكثير على ذلك.

ولن أقول "قدر من واجهة وقت ممكن". ليس هناك الكثير الذي يمكن تحقيقه من خلال جعل operator+=، operator-= الخ ليست صديق لا عضوا.

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

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

وهناك أسباب محددة لجعل <م> certaint وظائف والمشغلين "غير صديق، غير عضو". على سبيل المثال، مشغل << () عند استخدامها ك "مشغل تيار الإدراج" لا يمكن إجراء عضوا لأنك لن تضطر إلى تغيير الطبقة LHS (تيار).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top