2016-02-21 2 views
-1

Я пытаюсь использовать ...Использование функций-членов в Другу Функция

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

ответ

1

Обе ваши функции объявлены как «нормальный» (ienon статического) функция-членов:

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

Когда я объявил их как «статический Int», он дал мне ошибку компилятора, «не может объявить функцию-член«статический Int Фракция: : GCD (int, int) ', чтобы иметь статическую связь [-fpermissive]. " – urallsad

+0

Вы были правы на самом деле, я объявлял их статическими в декларации и так же, как и определение, когда я снял это определение сработало! Спасибо! Можете ли вы рассказать о том, что делает реализация статики? – urallsad

+1

static имеет несколько значений. Но для членов класса «статический» означает «независимо от какого-либо конкретного объекта этого класса». Здесь [небольшой учебник] (http://www.tutorialspoint.com/cplusplus/cpp_static_members.htm), чтобы рассказать вам больше об этом. – Christophe

Смежные вопросы