我想知道是否有任何方法可以重载<<类的运算符,而不将其声明为友元函数。我的教授说这是唯一的方法,但我想知道他是否还有另一种不知道的方式。
答案 0 :(得分:2)
无需使操作符<<只要您想要输出的所有内容都可以通过类的公共接口访问,就可以运行该类的朋友。
答案 1 :(得分:0)
是的,你可以
std::ostream& operator<<(std::ostream &stream, WHATEVER_TYPE var) {
std::string str = somehowstringify(var);
return stream << str;
}
但请注意,由于它是非会员的非朋友功能,它当然只能访问std::ostream
的公共界面,这通常不是问题。
答案 2 :(得分:0)
是的,一种方法就是这样:
class Node
{
public:
// other parts of the class here
std::ostream& put(std::ostream& out) const { return out << n; };
private:
int n;
};
std::ostream& operator<<(std::ostream& out, const Node& node) {
return node.put(out);
}
答案 3 :(得分:0)
当且仅当您需要访问其私人会员时,您才需要声明它是友方功能。
如果出现以下情况,您可以随时执行此操作:
1)不需要私人会员访问。
2)您提供了一种访问您的私人成员的机制。 e.g。
class foo
{
int myValue;
public:
int getValue()
{
return myValue;
}
}
答案 4 :(得分:0)
正如R Sahu指出的那样,要求操作员应该能够访问它必须显示的所有内容。
以下是一些可能的选项
1.将重载函数添加为友元函数
2.使用公共访问者方法或公共数据成员为函数访问所有必需的数据成员
class MyClass {
private:
int a;
int b;
int c;
public:
MyClass(int x,int y,int z):a(x),b(y),c(z) {};
MyClass():a(0),b(0),c(0) {};
int geta() { return a; }
int getb() { return b; }
int getc() { return c; }
};
std::ostream& operator<<(std::ostream &ostr,MyClass &myclass) {
ostr << myclass.geta()<<" - " << myclass.getb() << " - " << myclass.getc() ;
return ostr;
}
int main (int argc, char const* argv[])
{
MyClass A(4,5,6);
cout << A <<endl;
return 0;
}
3.添加公共帮助函数,例如output
,签名为std::ostream& output(std::ostream& str)
,稍后在运算符函数中使用。