过载运算符<<在c ++的一个类中

时间:2009-07-29 14:00:26

标签: c++ operator-overloading

我有一个使用struct的类,我想重载<<该结构的运算符,但仅限于类:

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

我只能在声明运算符&lt;&lt;使用friend关键字重载,但操作符在我的代码中到处都是重载,而不仅仅是在类中。如何重载&lt;&lt; my_struct的运算符只在类中?

编辑:我想使用重载运算符来打印my_struct,它是My_Class的成员

3 个答案:

答案 0 :(得分:10)

不要使用运算符&lt;&lt;。使用命名成员函数,并将其设为私有。

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

请注意,无论使用哪种方法,都应将结构作为const引用传递。

修改:无需设置运算符&lt;&lt;该类的成员只是为了您可以使用它来打印该类的成员。你可以使它成为结构的朋友,或者是一个完全自由的函数,然后由类使用。

答案 1 :(得分:9)

  

如何重载&lt;&lt; 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的{​​{1}}文件中。

编辑:如果您确实需要在类上进行范围而不是其他任何内容,则将其定义为所述类中的私有静态函数。它只会在该类的范围内,而且它是子类。它将隐藏为不相关的类定义的所有其他自定义MyClass,但(仅在类内部,它是子类),除非它们可以在ADL中找到,或者已经是operator<<的成员。

答案 2 :(得分:1)

如果“仅在My_Class中重载”,则表示只有我的类可见/可用,您可以使用仅对My_Class可见的非成员重载。 E.g。

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