如何从另一个 class 访问朋友功能?

How to access friend function from another class?

当我编译下面的代码时,

#include <iostream>
using namespace std;
class class1;//forward declaration

class class1{
int var;
public:
    void setter(int);
    friend void getter(class1 o1);
};

class class2{
public:
    void getter(class1 o1)
    {
        o1.var;
    }
};

void class1::setter(int v)
{
    var =v;
}
int main()
{
    int val;
    class1 o1;
    class2 o2;
    cout<<"Enter value\n";
    cin>>val;
    o1.setter(val);
    cout <<"value:\n"<<o2.getter(o1);
    return 0;
}

我收到以下错误, G:\C++ projects\private 访问 specifier\main.cpp|6|错误:'int class1::var' 是私有的| G:\C++ projects\private 访问 specifier\main.cpp|16|错误:在此上下文中| G:\C++ projects\private access specifier\main.cpp|32|error: no match for 'operator<<' (operand types are 'std::basic_ostream' and 'void')|

这里我需要访问一个私有成员 'var' form class1 和 class2 中的函数 'getter' 我知道还有另一种更简单的方法来获取和设置值,但我来这里是为了了解友元函数的工作原理。 请澄清我的疑问,因为我是 C++ 的新手

这个

friend void getter(class1 o1);

授予好友访问 class1 的私有权限给名为 getter 的免费函数。您的代码中没有这样的功能。 class1 可以像这样让朋友访问 class2

class class2;//forward declaration

class class1{
int var;
public:
    void setter(int);
    friend class2;
};

这也无法编译:cout <<"value:\n"<<o2.getter(o1);。我想你想要 getter 到 return 值:

class class2{
public:
    int getter(const class1& o1)
    {
        return o1.var;
    }
};

class1中,这个声明:

friend void getter(class1 o1);

表示函数 getterclass1 的友元。

但是,您希望 class2 的成员函数能够访问 class1 成员。在这种情况下,您可以将友谊授予 class2 本身,这将允许 class2 的成员函数访问 class1:

的私有成员
class class2; // forward declaration

class class1 
{
  // ...
  friend class2;
};

此外,请注意这一行:

cout << "value:\n" << o2.getter(o1);

不会编译,因为 class2::getter returns void 你不能传递给 ostream.

其他答案告诉您如何以最简单(也可能是最好)的方式解决问题。但是,如果您真的只想将好友权限授予单个成员函数,则需要做更多的工作:

class class1;

// To befriend a member function of class2, it must be defined before the friendship declaration
class class2{
public:
    int getter(class1 o1); 
};


class class1{
    int var;
public:
    void setter(int);
    //correct syntax mentions the class name
    friend int class2::getter(class1 o1);
};

void class1::setter(int v)
{
    var =v;
}

// definition of this function must be after class1 definition, 
// so it can know that `class1` has member `var`
// therefore it cannot be defined inline in class
int class2::getter(class1 o1) 
{
    return o1.var;
}

See it online