在友元函数中使用成员函数

Using Member Functions in a Friend Function

本文关键字:函数 成员 友元      更新时间:2023-10-16

我正在尝试使用...

int Fraction::GCD(int a, int b)
{
    for (;;)
    {
        if (a == 0)
            return b;
        b %= a;
        if (b == 0)
            return a;
        a %= b;
    }
}
int Fraction::LCD(int a, int b)
{
    return (abs(a * b) / GCD(a, b));
}

。它位于我的分数班的私人空间。

我收到编译器错误"'LCD'未在此范围内声明"时尝试在我的重载朋友运算符中调用它......

Fraction operator + (const Fraction &x, const Fraction &y)
{
    Fraction temp;
    static int lcd = LCD(x.denom, y.denom); // <--
    if (lcd / x.denom != 1)
        temp.num = x.num * (lcd / x.denom);
    if (lcd / y.denom != 1)
        temp.num += y.num * (lcd / y.denom);
    temp.denom = LCD(x.denom, y.denom);
    return temp;
}

你的两个函数都被声明为"普通"(即非静态)成员函数:

class Fraction {
    int GCD(int a, int b); 
    int GCD(int a, int b); 
    ...
public: 
    ...
};

如果将运算符声明为友元,则可以从此运算符访问它们,但应使用对象调用它们:

temp.denom = temp.LCD(x.denom, y.denom);

如果你在没有对象的情况下调用它们,就像你一样:

temp.denom = LCD(x.denom, y.denom);

编译器找不到:没有任何东西告诉他你正在从成员函数说话

幸运的是,看起来您的函数GCD()LCD()实际上完全独立于 Fraction 对象的状态:他们只取决于他们的论点。 因此,您可以/应该将它们声明为静态。

class Fraction {
    static int GCD(int a, int b); 
    static int GCD(int a, int b); 
    ...
};

然后,您可以在不指定对象的情况下调用它们:

temp.denom = Fraction::LCD(x.denom, y.denom);