我怎么能用cout << myclass

ali*_*ali 71 c++ integer class input

myclass 是我写的一个C++类,当我写的时候:

myclass x;
cout << x;
Run Code Online (Sandbox Code Playgroud)

我如何输出10或者20.2像一个integer或一个float值?

Jer*_*fin 84

通常通过operator<<为您的班级重载:

struct myclass { 
    int i;
};

std::ostream &operator<<(std::ostream &os, myclass const &m) { 
    return os << m.i;
}

int main() { 
    myclass x(10);

    std::cout << x;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

  • 注意,如果`myclass`有任何`private`字段,并且你想要`operator <<()`输出它们,`myclass`应该声明`std :: ostream&operator <<(std :: ostream&,myclass const&)`作为一个朋友. (7认同)
  • 对于像我一样困惑的人,请将运算符重载放在类定义的*外部*(就像示例中一样)。 (4认同)
  • @Nubcake:不.就编译器而言,这两个意思相同,但我仍然认为前缀形式错误.要阅读C++声明,你可以从声明的内容开始,然后向外工作,在类型之后使用`const`,它说:`m是对const myclass`的引用.在类型之前,它说"m是对myclass const的引用",它正好在无意义和真正不合语法之间的粗糙边缘. (3认同)
  • 这不应该是`const myclass&m`而不是`myclass const&m`吗? (2认同)
  • @Lorenzo:不,它不能是成员函数。有关更多详细信息,请参阅 /sf/answers/687011741/。 (2认同)

Ric*_*ams 20

你需要重载<<操作员,

std::ostream& operator<<(std::ostream& os, const myclass& obj)
{
      os << obj.somevalue;
      return os;
}
Run Code Online (Sandbox Code Playgroud)

然后当你这样做时cout << x(在你的情况下属于哪种x类型myclass),它会输出你在方法中告诉它的任何内容.在上面的例子的情况下,它将是x.somevalue成员.

如果成员的类型不能直接添加到a ostream,那么您还需要<<使用与上面相同的方法重载该类型的运算符.

  • 那是左移运算符,而不是"流运算符".在Iostreams的上下文中,它是插入或提取运算符,但它永远不是流运算符. (4认同)

Gui*_*cot 13

即使其他答案提供了正确的代码,也建议使用隐藏的友元函数来实现operator<<. 隐藏友元函数的范围更有限,因此编译速度更快。由于混乱命名空间范围的重载较少,因此编译器要做的查找工作也较少。

struct myclass { 
    int i;

    friend auto operator<<(std::ostream& os, myclass const& m) -> std::ostream& { 
        return os << m.i;
    }
};

int main() { 
    auto const x = myclass{10};
    std::cout << x;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)


Tri*_*ner 9

这很简单,只需实施:

std::ostream & operator<<(std::ostream & os, const myclass & foo)
{
   os << foo.var;
   return os;
}
Run Code Online (Sandbox Code Playgroud)

你需要返回一个os的引用来链接outpout(cout << foo << 42 << endl)