سؤال

لدي الدرجة التي تستخدم البنية و أريد أن تفرط في << المشغل لتلك البنية ، ولكن فقط داخل الصف:

typedef struct my_struct_t {
  int a;
  char c;
} my_struct;

class My_Class
{
  public:
    My_Class();
    friend ostream& operator<< (ostream& os, my_struct m);
}

يمكنني فقط تجميع عندما أعلن المشغل<< الزائد w/ صديق الكلمة ، ولكن ثم المشغل طاقتها في كل مكان في قانون بلدي, ليس فقط في الدرجة.كيف تفرط في << مشغل my_struct فقط داخل الصف ؟

تحرير:سوف ترغب في استخدام طاقتها مشغل طباعة my_struct وهو عضو My_Class

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

المحلول

<اقتباس فقرة>   

وكيف تفرط في << المشغل لmy_struct فقط داخل الصف؟

وعرف أنها

static std::ostream & operator<<( std::ostream & o, const my_struct & s ) { //...

أو

namespace {
    std::ostream & operator<<( std::ostream & o, const my_struct & s ) { //...
}

في ملف .cpp التي تقوم بتنفيذ MyClass.

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

نصائح أخرى

لا تستخدم مشغل <<.استخدام مسمى وظيفة عضو و تجعل من القطاع الخاص.

class My_Class
{
  public:
    My_Class();
 private:
    void Print( ostream & os, const my_struct & m );
};

ملاحظة يجب تمرير بنية const المرجعية ، أيهما الطريقة التي تستخدمها.

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

وإذا كان عن طريق "مثقلة فقط في My_Class" تقصد مرئيا فقط / قابلة للاستخدام من قبل صفي هل يمكن استخدام الزائد غير الأعضاء التي يكون مرئيا سوى My_Class. منها مثلا.

   struct my_struct {
      int a;
      char c;
   };

   class My_Class
   {
      publiC:
         My_Class();
   }

وبعد ذلك في My_Class.cpp:

namespace {
    ostream& operator(ostream& os, const my_struct& mystruct ) {
         os << mystruct.a << mystruct.c;
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top