过载的operator <<在C类中++(overload operator<&l

2019-06-27 03:27发布

我有一个使用一个结构类,我想重载<<操作为结构,但仅限于类:

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

当我宣布运营商<<超载瓦特/朋友的关键字,但随后的运营商是在我的代码到处都是超载,不只是在课堂上,我只能编译。 如何重载只有类中的<<运营商my_struct?

编辑:我将要使用重载运算符来打印为My_Class成员的my_struct

Answer 1:

如何重载只有类中的<<运营商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了。



Answer 2:

不要使用操作符<<。 使用命名成员函数,并使其私人。

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

请注意,您应该通过结构为const引用,无论使用哪种方法。

编辑:有没有必要使运营商<<类中的一员,所以您可以用它来打印类的成员。 你可以把它的结构,或者完全免费的功能,它的类,然后使用的一个朋友。



Answer 3:

如果“只在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;
    }
}


文章来源: overload operator<< within a class in c++