【问题标题】:How to access friend function from another class?如何从另一个班级访问朋友功能?
【发布时间】:2021-02-13 19:34:50
【问题描述】:

当我编译以下代码时,

#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' 是私有的| G:\C++ 项目\私有访问说明符\main.cpp|16|错误:在此上下文中| G:\C++ projects\private access specifier\main.cpp|32|error: no match for 'operator

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

【问题讨论】:

    标签: c++ friend friend-function


    【解决方案1】:

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

    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

    【讨论】:

    • 很好 :) 只是想添加这个。
    • 你确定 cmets 是对的吗?我不认为函数参数必须是完整的类型,只有返回类型。参数不必是引用/指针。
    • @cigien 是的,你是对的。我正在一一解决编译器错误以达到此目的,并且不需要进行更改。
    【解决方案2】:

    这个

    friend void getter(class1 o1);
    

    class1 的私人信息授予朋友访问名为getter 的免费功能。您的代码中没有这样的功能。 class1 可以让朋友访问class2,如下所示:

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

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

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

    【讨论】:

      【解决方案3】:

      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

      【讨论】:

      • 是否可以仅将友谊授予单个类成员函数,还是必须授予整个类? ETA:哦,我看到 Yksisarvinen 的回答提到了这一点。
      • @NathanPierson 绝对。请参阅 Yksivarvinen 的回答 :)
      猜你喜欢
      • 2011-04-23
      • 1970-01-01
      • 1970-01-01
      • 2015-11-24
      • 2017-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-02
      相关资源
      最近更新 更多