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

时间:2016-02-21 23:56:09

标签: c++

我正在尝试使用......

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));
}

...位于我的Fraction类的私人中。

我收到一个编译器错误“'在这个范围内未声明'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;
}

1 个答案:

答案 0 :(得分:1)

你的两个职能都被宣布为&#34;正常&#34; (即非静态)成员函数:

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);