我的代码已经过审核: https://codereview.stackexchange.com/questions/3754/c-script-could-i-get-feed-back/3755#3755
使用以下内容:
class Point
{
public:
float distance(Point const& rhs) const
{
float dx = x - rhs.x;
float dy = y - rhs.y;
return sqrt( dx * dx + dy * dy);
}
private:
float x;
float y;
friend std::istream& operator>>(std::istream& stream, Point& point)
{
return stream >> point.x >> point.y;
}
friend std::ostream& operator<<(std::ostream& stream, Point const& point)
{
return stream << point.x << " " << point.y << " ";
}
};
由另一名成员。我不明白朋友的功能在做什么。有没有其他方法可以做到这一点,而不是让他们成为朋客户端如何在私有时使用以下方式访问它们?有人可以解释究竟是什么回归?
int main()
{
std::ifstream data("Plop");
// Trying to find the closest point to this.
Point first;
data >> first;
// The next point is the closest until we find a better one
Point closest;
data >> closest;
float bestDistance = first.distance(closest);
Point next;
while(data >> next)
{
float nextDistance = first.distance(next);
if (nextDistance < bestDistance)
{
bestDistance = nextDistance;
closest = next;
}
}
std::cout << "First(" << first << ") Closest(" << closest << ")\n";
}
答案 0 :(得分:1)
客户端如何在私有时使用以下内容访问它们?
是。由于friend
函数不是类的成员,因此无论您在何处定义它们或声明它们都无关紧要。任何人都可以使用它们访问规则不适用于它们。
有人可以解释究竟要归还的内容吗?
operator>>()
返回引用输入流的std::istream&
。
operator<<()
返回引用输出流的std::ostream&
。
有没有其他方法可以做到这一点,而不是让他们成为朋友的功能?
是。有一种方法。您可以将两个成员函数input
和output
添加到类的public
部分,这将执行friend
函数现在正在执行的操作,并且您可以{{1} }}和operator<<
非朋友的功能如下:
operator>>
答案 1 :(得分:1)
你可以通过为你的X和Y成员变量定义'getters'和一个合适的构造函数来完成没有友元函数的操作,就像这样
class Point
{
public:
Point(float xx, float yy) : x(xx), y(yy) {}
float getX() const { return x; }
float getY() const { return y; }
private:
float x;
float y;
};
std::istream& operator>>(std::istream& stream, Point& point)
{
float x, y;
stream >> x >> y;
point = Point(x, y);
return stream;
}
std::ostream& operator<<(std::ostream& stream, const Point& point)
{
return stream << point.getX() << " " << point.getY() << " ";
}
选择,两者都有效。
答案 2 :(得分:0)
友元函数独立于类,但允许访问私有成员。
在您的课程中,无法访问x
和y
成员(这使得该类无用,顺便说一句),以便能够处理对流的实例读/写这些功能必须被宣布为朋友。
如果你之前从未见过friend
概念,那可能意味着你正试图通过编写代码来教自己C ++。这是一个可怕的想法......由于许多不同的原因,C ++无法以这种方式学习。
选择a good book并阅读封面以覆盖然后进行实验。这是迄今为止最快(唯一)的方式。
你有多聪明并不重要(实际上你越聪明,通过实验学习C ++就越困难:逻辑在这个地方并不总是有帮助。)