C ++ Friend语法/语义问题

时间:2011-07-31 06:38:38

标签: c++ stl

我的代码已经过审核: 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";
}

3 个答案:

答案 0 :(得分:1)

  

客户端如何在私有时使用以下内容访问它们?

是。由于friend函数不是类的成员,因此无论您在何处定义它们或声明它们都无关紧要。任何人都可以使用它们访问规则不适用于它们。

  

有人可以解释究竟要归还的内容吗?

operator>>()返回引用输入流的std::istream&operator<<()返回引用输出流的std::ostream&

  

有没有其他方法可以做到这一点,而不是让他们成为朋友的功能?

是。有一种方法。您可以将两个成员函数inputoutput添加到类的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)

友元函数独立于类,但允许访问私有成员。

在您的课程中,无法访问xy成员(这使得该类无用,顺便说一句),以便能够处理对流的实例读/写这些功能必须被宣布为朋友。

如果你之前从未见过friend概念,那可能意味着你正试图通过编写代码来教自己C ++。这是一个可怕的想法......由于许多不同的原因,C ++无法以这种方式学习。

选择a good book并阅读封面以覆盖然后进行实验。这是迄今为止最快(唯一)的方式。

你有多聪明并不重要(实际上你越聪明,通过实验学习C ++就越困难:逻辑在这个地方并不总是有帮助。)