如果可能,作为非成员和非朋友功能。
如Herb Sutter和Scott Meyers所述,与成员函数相比,更喜欢非朋友非成员函数,以帮助增加封装性。
在某些情况下,例如C ++流,您将没有选择,必须使用非成员函数。
但是,这并不意味着您必须使这些函数成为您的类的朋友:这些函数仍然可以通过类访问器访问类。如果您以这种方式成功编写了这些功能,那么您就赢了。
关于运算符<<和>>原型
我相信您在问题中举的例子是错误的。例如;
ostream & operator<<(ostream &os) {
return os << paragraph;
}
我什至无法开始考虑此方法如何在流中工作。
这是实现<<和>>运算符的两种方法。
假设您要使用类型T的类似流的对象。
并且您要从中提取/插入/插入到Taragraph类型的对象的相关数据中。
通用运算符<<和>>函数原型
首先是作为功能:
// T << Paragraph
T & operator << (T & p_oOutputStream, const Paragraph & p_oParagraph)
{
// do the insertion of p_oParagraph
return p_oOutputStream ;
}
// T >> Paragraph
T & operator >> (T & p_oInputStream, const Paragraph & p_oParagraph)
{
// do the extraction of p_oParagraph
return p_oInputStream ;
}
通用运算符<<和>>方法原型
第二种是方法:
// T << Paragraph
T & T::operator << (const Paragraph & p_oParagraph)
{
// do the insertion of p_oParagraph
return *this ;
}
// T >> Paragraph
T & T::operator >> (const Paragraph & p_oParagraph)
{
// do the extraction of p_oParagraph
return *this ;
}
请注意,要使用此表示法,必须扩展T的类声明。对于STL对象,这是不可能的(您不应修改它们...)。
如果T是C ++流,该怎么办?
这是C ++流相同的<<和>>运算符的原型。
对于通用basic_istream和basic_ostream
请注意,在流的情况下,由于无法修改C ++流,因此必须实现这些函数。这意味着:
// OUTPUT << Paragraph
template <typename charT, typename traits>
std::basic_ostream<charT,traits> & operator << (std::basic_ostream<charT,traits> & p_oOutputStream, const Paragraph & p_oParagraph)
{
// do the insertion of p_oParagraph
return p_oOutputStream ;
}
// INPUT >> Paragraph
template <typename charT, typename traits>
std::basic_istream<charT,traits> & operator >> (std::basic_istream<charT,traits> & p_oInputStream, const CMyObject & p_oParagraph)
{
// do the extract of p_oParagraph
return p_oInputStream ;
}
对于char istream和ostream
以下代码仅适用于基于字符的流。
// OUTPUT << A
std::ostream & operator << (std::ostream & p_oOutputStream, const Paragraph & p_oParagraph)
{
// do the insertion of p_oParagraph
return p_oOutputStream ;
}
// INPUT >> A
std::istream & operator >> (std::istream & p_oInputStream, const Paragraph & p_oParagraph)
{
// do the extract of p_oParagraph
return p_oInputStream ;
}
Rhys Ulerich评论了基于char的代码只是其上方通用代码的“专业化”这一事实。当然,Rhys是对的:我不建议使用基于char的示例。仅在这里给出它是因为它更易于阅读。由于仅在使用基于字符的流时才可行,因此应在常见wchar_t代码的平台(例如Windows)上避免使用它。
希望这会有所帮助。