سؤال

أنا أكتب جدول تجزئة لفئة بنيات البيانات الخاصة بي، وأرغب في إضافة القليل من السكر النحوي إلى تنفيذي.

template <typename HashedObj, typename Object>
Object & Dictionary<HashedObj, Object>::operator[](HashedObj & key)
{
  return items.lookup(key);
}

يعمل هذا بشكل جيد عندما أفعل شيئًا مثل cout << dict["mykey"]. ولكن كيف يمكنني القيام بالمهمة مع الأقواس؟ شيء مثل:

dict["mykey"] = "something";

لا، هذا ليس جزءًا من واجباتي المنزلية (لا أقصد التورية)، أريد فقط أن أتعلم لغة C++ بشكل أفضل قليلاً.

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

المحلول

ليس من الواضح ما الذي تطلبه هنا بالضبط.الكود الذي قدمته يدعم المهمة بالفعل.فقط افعل ذلك وستعمل حسب الرغبة (أو على الأقل يجب أن يتم تجميعها).لا يوجد فرق على الإطلاق في أي جانب من عامل المهمة محمل فوق طاقتك [] يستخدم على.ستعمل بنفس الطريقة تمامًا على الجانب الأيسر (LHS) كما تعمل على الجانب الأيمن (RHS) من المهمة (أو كمعامل لـ <<, ، كما في رسالتك الأصلية).لك [] إرجاع إشارة إلى Object, ، وبعد ذلك يتم التعامل مع المهمة الفعلية بواسطة مشغل المهمة الخاص بك Object اكتب، وهذا يعني أن [] في حد ذاته لا يشارك حقًا في المهمة الفعلية.

السؤال الحقيقي هنا هو كيف تريد الخاص بك [] التصرف في بعض الحالات الخاصة.ماذا سيحدث إذا لم يكن مفتاحك موجودًا في الجدول؟إشارة إلى ماذا Object هو الخاص بك lookup هل سيعود في هذه الحالة؟

من المستحيل معرفة ما نشرته.أرى أنه يُرجع مرجعًا، لذا يعود NULL غير وارد.هل إدراج جديدة، فارغة Object للمفتاح المحدد؟إذا كان الأمر كذلك، فليس عليك أن تفعل أي شيء.لك [] جاهز تمامًا للاستخدام في LHS الخاص بالمهمة.(هذه هي الطريقة [] في std::map يعمل، راجع للشغل)

في حالة الخاص بك lookup إرجاع إشارة إلى "حارس" خاص Object, ، عليك اتخاذ خطوات خاصة.ربما لا ترغب في تعيين أي شيء لكائن "حارس"، لذلك يتعين عليك "تعطيل" عامل التعيين الخاص به بطريقة ما، وبذلك تكون قد انتهيت.والباقي يجب أن يعمل كما هو.

إذا كان لديك lookup يلقي استثناءً في حالة عدم وجود مفتاح، فيجب عليك أن تقرر ما إذا كان هذا هو ما تريده عندما [] يتم استخدامه في LHS للمهمة.إذا كان الأمر كذلك، فلن تحتاج إلى القيام بأي شيء.إذا لم يكن الأمر كذلك، فسوف يستغرق الأمر بعض العمل الإضافي ...

لذا، مرة أخرى، ماذا يحدث إذا قمت بتمرير مفتاح غير موجود إلى lookup?

ملاحظة.بالإضافة إلى ذلك، عادةً ما يكون من المنطقي الإعلان عن []lookup) مع أي منهما const HashedObj& المعلمة أو فقط HashedObj معامل.يبدو المرجع غير الثابت، كما في المثال الخاص بك، غريبًا وقد يؤدي إلى مشاكل في بعض الحالات (في الواقع، في معظمها).أنا مندهش أنه يعمل بالنسبة لك الآن ...

نصائح أخرى

تحتاج إلى التحميل الزائد مرتين.واحد من شأنه أن يكون const, ، والذي سيكون data access الجزء، والآخر الذي سيُرجع مرجعًا، والذي سيكون بمثابة "أداة الضبط".

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

لذلك، إذا كان لديك std::map<K,V> mymap, ، ثم الاتصال mymap[someKey] سيرجع إما مرجعًا إلى القيمة المرتبطة بـ someKey, وإلا فإنه سيتم إنشاء كائن جديد من النوع V بالاتصال V() (المنشئ الافتراضي لـ V) ثم قم بإرجاع مرجع إلى هذا الكائن الجديد، والذي يسمح للمتصل بتعيين قيمة للكائن.

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