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

时间:2020-10-31 15:54:19

标签: c++ friend friend-function

当我编译以下代码时,

#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 ++项目\私有访问说明符\ main.cpp | 6 |错误:“ int class1 :: var”是private | G:\ C ++项目\专用访问说明符\ main.cpp | 16 |错误:在此上下文中| G:\ C ++项目\专用访问说明符\ main.cpp | 32 |错误:“ operator <<”不匹配(操作数类型为“ std :: basic_ostream”和“ void”)|

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

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

friend void getter(class1 o1);

允许朋友访问class1的私人帐户,以使用名为getter的免费功能。您的代码中没有此类功能。 class1可以让朋友访问class2,如下所示:

class class2;//forward declaration

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

这也不会编译:{{1​​}}。我想您希望cout <<"value:\n"<<o2.getter(o1);返回值:

getter

答案 2 :(得分:1)

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返回void,因此无法编译,您无法将其传递给ostream