سؤال

أحاول تجميع مثل هذا الكود:

#include <iostream>
using namespace std;

class CPosition
{
  private:
    int itsX,itsY;
  public:
    void Show();
    void Set(int,int);
};

void CPosition::Set(int a, int b)
{
  itsX=a;
  itsY=b;
}

void CPosition::Show()
{
    cout << "x:" << itsX << " y:" << itsY << endl;
}

class CCube
{
  friend class CPosition;
  private:
         CPosition Position;
};

main()
{
  CCube cube1;

  cube1.Position.Show();
  cube1.Position.Set(2,3);
  cube1.Position.Show();
}

لكن الحصول على "CCube::Position" لا يمكن الوصول إليه في الوظيفة الرئيسية () 3 مرات.أريد أن يتم الإعلان عن فئة CPosition خارج Ccube حتى أتمكن من استخدامه في المستقبل في فئات جديدة على سبيل المثال.CBall :) ولكن كيف يمكنني أن أجعله يعمل دون استخدام الميراث.هل هو ممكن :)؟

التحيات ، PK

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

المحلول

وبالإضافة إلى جالبة العادي يجب أيضا أن يكون لها جالبة CONST.
يرجى ملاحظة عودة بالرجوع. هذا يسمح لك أي استدعاء SetXX () لتؤثر على نسخة من الوظيفة داخل CCube وليس النسخة التي كنت قد التحديث.

class CCube
{
    private:
        CPosition Position;
    public:
        CPosition&       getPosition()       { return Position; }
        CPosition const& getPosition() const { return Position; }
};

نصائح أخرى

ووfriend class CPosition; بيان يعني أن CPosition يمكن الآن الوصول إلى أعضاء الخاص من فئة CCube. إلى كل فئة أخرى أعضاء لا تزال الخاص كما كنت أعلن لهم. لجعل عمل عينة وكنت:

class CCube
{
     public:
         CPosition Position;
};

والخطأ، لا، الوظيفة غير مرئية في وظيفة "الرئيسي"

تأكد أن الجمهور ... أو وضع وظيفة جالبة العامة في

وسيحتاج إعلان صديقك أن يكون

friend int main();

وأنت إعطاء الإذن 'الرئيسي' للوصول إلى عضو خاص CCube ل.

حسنا، كنت حصلت بالفعل إجابة عن الخطأ. الأشياء واحد على الرغم من: هل الخطة على وجود وصول مكعب أعضاء الخاص CPosition (itsX، يتسي)؟ إذا لم يكن كذلك، فإنه لا حاجة إلى أن يعلن كصديق. إذا كان كذلك، النظر في فضح الأساليب العامة في CPosition للعودة X و Y، وكنت لا تزال لا تحتاج إلى نعلن على أنها صديق.

وما أقوله هو أنك بحاجة للتأكد من أن تحتاج إلى استخدام الأصدقاء. وهنا مكان جيد للبدء .

وموافق يعمل مع:

class CCube
{
  private:
         CPosition Position;
  public:
  CPosition& getPosition() { return Position; }
};

main()
{
  CCube cube1;

  cube1.getPosition().Show();
  cube1.getPosition().Set(2,3);
  cube1.getPosition().Show();
}

والشكر

لديك 3 أسئلة في سؤال واحد:

  1. قابلية إعادة الاستخدام CPosition
  2. كيفية التأثير على حالة الشكل (في هذه الحالة تتضمن عضوًا من النوع CPosition, ، ولكن قد يتضمن أيضًا int radius أو أي شيء آخر)
  3. استخدام friend الكلمة الرئيسية

أنت تقول بوضوح أنك بحاجة إلى الوصول إلى فئة CPosition من أماكن أخرى.حسنا، هو الطبقة.تم حل المشكلة 1.

إذا كنت تريد لك CCube ليتمكن المستخدمون من تغيير أ CCubeموقف، تحتاج إلى توفير وسيلة لذلك:

  1. بجعل CCube::Position عام
  2. عن طريق إضافة طرق الوصول - CCube::MoveTo( const CPosition& p ) و CCube::GetPosition() const.

كما قال @فراس:لا تلعب مع friend حتى تتأكد حقًا من أنك بحاجة إليه.

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