2013-07-27 4 views
-1

Я много искал, что не могу понять, но я действительно не нашел правильного ответа на небольшую дилемму, которую я имею о функциях «друг» и «нет». Итак, вот оно ...Дилемма друзей и немощных вопросов

Это пример код, чей рисунок похож на соответствующие коды, которые я видел:

struct SampleClass 
{ 
    friend void foo1(SampleClass &rhs); 
    void foo2(); 
private: 
    int bar; 
}; 

void foo1(SampleClass& rhs) 
{ 
    rhs.foo2(); 
} 

void foo3(SampleClass& rhs) 
{ 
    rhs.foo2(); 
} 

int main() 
{ 
    SampleClass samp; 
    foo1(samp); //friend function 
    foo3(samp); //not a friend function but has the same effect 
    return 0; 
} 

Почему, как мы используем функцию класса нечлена, который был идентифицирован с помощью «друга "ключевое слово похоже на функцию, которая не является? И почему не может первая функция (функция «friend» ed) получить доступ к переменной «bar», зная, что функция или класс «друга» может получить доступ к закрытым членам класса хоста?

+0

У меня возникли проблемы понять, что вы имеете в виду. 'foo2' явно публично. Попробуйте ввести 'rhs.bar = 5;' вместо 'rhs.foo2();' тогда вы увидите разницу. – PeterT

+0

Просьба включить код для того, о чем вы смущены. Как там, кажется, здесь нет никаких вопросов. ('bar', единственная' частная' вещь, никогда не обращается.) – Potatoswatter

ответ

3

Функциональные протоколы должны соответствовать. Изменение:

friend void foo1(); 

To:

friend void foo1(SampleClass& rhs); 
+0

Правильно, но все еще не решает мою проблему. – atoipowered

+0

@ atoi.powered. Что вы имеете в виду, имеет тот же эффект, void foo2() является публичной функцией ... –

+0

Где вы определяете foo2(), можете ли вы разместить код? –

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