оператор перегрузки << внутри класса в с ++ - PullRequest
5 голосов
/ 29 июля 2009

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

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

Я могу скомпилировать только когда я объявляю оператор << overload w / friend friend, но тогда оператор перегружен везде в моем коде, а не только в классе. Как перегрузить оператор << ТОЛЬКО для my_struct внутри класса? </p>

Редактировать: я хочу использовать перегруженный оператор для печати my_struct, который является членом My_Class

Ответы [ 3 ]

10 голосов
/ 29 июля 2009

Не используйте оператор <<. Используйте именованную функцию-член и сделайте ее приватной. </p>

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

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

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

9 голосов
/ 29 июля 2009

Как перегрузить оператор << ТОЛЬКО для my_struct внутри класса? </p>

Определите его как

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.

1 голос
/ 29 июля 2009

Если под «только перегружен в 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;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...