كيفية استخدام كائن واحد طريقة تحديث آخر الكائن الخاصية ؟

StackOverflow https://stackoverflow.com/questions/113033

  •  02-07-2019
  •  | 
  •  

سؤال

لدي ثلاثة (C++) الطبقات:لاعب, من ناحية, و بطاقة.

لاعب لديه عضو اليد التي تحمل باليد.كما أن لديها طريقة getHand () ، وهذا يعود محتويات اليد.

Hand Player::getHand() {
    return hand;
}

ناحية الأسلوب ، addCard(بطاقة ج) يضيف بطاقة اليد.

أريد أن أفعل هذا:

player1.getHand().addCard(ج) ؛

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

كيف يمكنني الحصول على هذا العمل ؟

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

المحلول

إذا getHand() لا يعود إشارة سوف تكون في ورطة.

نصائح أخرى

إذا getHand() ترجع من القيمة أنت بتعديل نسخة من اليد وليس الأصلي.

لاعب.addCardToHand() الأسلوب غير معقول ، إذا كان لديك أي سبب يدعو إلى فضح وإلا اليد.وربما هذا هو المثل الأعلى في بعض الطرق ، كما يمكن أن لا تزال توفر نسخ من اليد من أجل الفوز-التحقق من المقارنات, و لا أحد يستطيع تعديلها.

الأسلوب الخاص بك يحتاج إلى إرجاع مؤشر أو refernce إلى يد اللاعب الكائن.ثم يمكن أن نسميها مثل "player1.getHand()->addCard(ج)".علما بأن هذه هي الجملة التي تستخدمها أنه كان المؤشر.

عودة إشارة إلى يد كائن على سبيل المثال.

Hand &Player::getHand() {
    return hand;
}

الآن addCard() وظيفة التشغيل على الكائن الصحيح.

ما هو إعلان getHand()?هو العودة يد جديدة قيمة ، أو هو إرجاع اليد& مرجع ؟

كما ذكر, أنت من المحتمل تعديل نسخة بدلا من الأصلي.

لمنع هذا النوع من الخطأ ، يمكنك أن تعلن صراحة نسخ المنشئات يساوي شركات القطاع الخاص.

  private:
    Hand(const Hand& rhs);
    Hand& operator=(const Hand& rhs);

getX() هو في كثير من الأحيان اسم accessor وظيفة الأعضاء x ، على غرار الاستخدام الخاصة بك.ومع ذلك ، فإن "getX" accessor هو أيضا في كثير من الأحيان قراءة فقط وظيفة ، حتى أنه قد يكون من المستغرب في حالات أخرى من التعليمات البرمجية الخاصة بك قاعدة أن نرى دعوة إلى "getX" أن يعدل X.

لذلك أود أن أقترح بدلا من مجرد استخدام إشارة بمثابة عودة قيمة في الواقع تعديل كود التصميم قليلا.بعض البدائل:

  • فضح getMutableHand طريقة إرجاع المؤشر (أو المرجع).من خلال العودة المؤشر ، كنت تشير بقوة إلى أن المتصل يستخدم مؤشر التدوين بحيث يمكن لأي شخص قراءة رمز يرى أن هذا المتغير هو تغيير القيم, وليس للقراءة فقط.
  • جعل لاعب فئة فرعية من ناحية, بحيث أي شيء يتلاعب اليد أيضا يعمل مباشرة على اللاعب.حدسي, هل يمكن أن نقول أن اللاعب ليس من جهة ، ولكن من الناحية الوظيفية لديهم الحق في العلاقة - كل لاعب لديه بالضبط يد واحدة ، ويبدو أن كنت تريد أن تكون قادرة على الوصول إلى يد عبر لاعب كما تفعل مباشرة.
  • مباشرة تنفيذ addCard طريقة لاعب من الدرجة.
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top