Вопрос

У меня есть класс, использующий структуру, и я хочу перегрузить оператор << для этой структуры, но только внутри класса:

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);
}

Я могу скомпилировать только тогда, когда объявляю перегрузку оператора<< с ключевым словомfriend, но тогда оператор перегружается повсюду в моем коде, а не только в классе.Как перегрузить оператор << для 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 );
};

Обратите внимание, что вы должны передавать структуру как константную ссылку, какой бы метод вы ни использовали.

Изменить . Оператору < < нет необходимости член класса просто так, чтобы вы могли использовать его для печати члена класса. Вы можете сделать его другом структуры или полностью бесплатной функцией, которую затем использует класс.

Если по " перегружено только в 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