C++ << 没有友元函数的运算符重载
C++ << operator overloading without friend function
正如题目所说。有可能这样做吗?我能够通过重载“+”运算符来实现这一点,但是,我无法使用“<<”运算符来实现这一点。
这是一个适用于我的友元函数的代码示例:
class Punkt2D
{
int x,y;
public:
Punkt2D(int wartoscX, int wartoscY) : x(wartoscX), y(wartoscY) {}
friend ostream& operator<<(ostream& out, Punkt2D& punkt);
};
ostream& operator<<(ostream& out, Punkt2D& punkt)
{
out << "(" << punkt.x << ", " << punkt.y << ")" << endl;
return out;
}
int main()
{
Punkt2D p1(10,15);
cout << p1 << endl;
return 0;
}
我在“+”上尝试了这段代码,但没有与该函数成为朋友。其他运营商也可以吗?也许这是一个愚蠢的问题,但是我对 C++ 很陌生,找不到关于该主题的任何资源:(
class Vector
{
public:
double dx, dy;
Vector() {dx=0; dy=0;}
Vector(double x, double y)
{
cout << "Podaj x " << endl;
cin >>x;
cout << "Podaj y " << endl;
cin >> y;
dx = x; dy = y;
}
Vector operator+ (Vector v);
};
Vector Vector::operator+ (Vector v)
{
Vector tmpVector;
tmpVector.dx = dx +v.dx;
tmpVector.dy = dy+ v.dy;
return tmpVector;
}
int main()
{
double d,e;
Vector a(d,e);
Vector b(d,e);
Vector c;
c = a +b;
cout<<endl << c.dy << " " << c.dx;
return 0;
}
需要好友才能访问私人会员。
Vector
中的成员是public,所以不一样。
只要该函数只调用 class 的 public
成员函数(或访问 public
数据成员,如果有的话)它不需要是友元。
您的 Vector
示例仅访问 public
成员,因此有效。
您的 Punkt2D
正在访问 private
成员,因此接线员需要是朋友。
流媒体运营商:
operator << output
operator >> input
当您将它们用作流运算符(而不是二进制移位)时,第一个参数是一个流。由于您无权访问流对象(它不是您可以修改的),因此它们不能成为成员运算符,它们必须在 class 外部。因此,他们必须是 class 的朋友,或者可以使用 public 方法为您进行流式传输。
正如题目所说。有可能这样做吗?我能够通过重载“+”运算符来实现这一点,但是,我无法使用“<<”运算符来实现这一点。
这是一个适用于我的友元函数的代码示例:
class Punkt2D
{
int x,y;
public:
Punkt2D(int wartoscX, int wartoscY) : x(wartoscX), y(wartoscY) {}
friend ostream& operator<<(ostream& out, Punkt2D& punkt);
};
ostream& operator<<(ostream& out, Punkt2D& punkt)
{
out << "(" << punkt.x << ", " << punkt.y << ")" << endl;
return out;
}
int main()
{
Punkt2D p1(10,15);
cout << p1 << endl;
return 0;
}
我在“+”上尝试了这段代码,但没有与该函数成为朋友。其他运营商也可以吗?也许这是一个愚蠢的问题,但是我对 C++ 很陌生,找不到关于该主题的任何资源:(
class Vector
{
public:
double dx, dy;
Vector() {dx=0; dy=0;}
Vector(double x, double y)
{
cout << "Podaj x " << endl;
cin >>x;
cout << "Podaj y " << endl;
cin >> y;
dx = x; dy = y;
}
Vector operator+ (Vector v);
};
Vector Vector::operator+ (Vector v)
{
Vector tmpVector;
tmpVector.dx = dx +v.dx;
tmpVector.dy = dy+ v.dy;
return tmpVector;
}
int main()
{
double d,e;
Vector a(d,e);
Vector b(d,e);
Vector c;
c = a +b;
cout<<endl << c.dy << " " << c.dx;
return 0;
}
需要好友才能访问私人会员。
Vector
中的成员是public,所以不一样。
只要该函数只调用 class 的 public
成员函数(或访问 public
数据成员,如果有的话)它不需要是友元。
您的 Vector
示例仅访问 public
成员,因此有效。
您的 Punkt2D
正在访问 private
成员,因此接线员需要是朋友。
流媒体运营商:
operator << output
operator >> input
当您将它们用作流运算符(而不是二进制移位)时,第一个参数是一个流。由于您无权访问流对象(它不是您可以修改的),因此它们不能成为成员运算符,它们必须在 class 外部。因此,他们必须是 class 的朋友,或者可以使用 public 方法为您进行流式传输。