我正在尝试使用......
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;
}
答案 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);