【问题标题】:Can 2 classes share a friend function?2个班级可以共享一个朋友功能吗?
【发布时间】:2013-08-23 13:38:20
【问题描述】:

今天我对朋友功能有疑问。 两个班级可以有相同的朋友功能吗? 说例子 friend void f1(); 在 A 类和 B 类中声明。这可能吗?如果可以,函数 f1() 可以访问两个类的成员吗?

【问题讨论】:

  • 是的,这是可能的。是的,f1() 可以访问这两个类的成员。
  • 你试过编译一个简单的例子吗?这似乎很容易测试。
  • 是什么让你认为这不可能是可能的?

标签: c++ friend-function


【解决方案1】:

一个例子可以很好地解释这一点:

class B;                   //defined later

void add(A,B);

class A{
    private:
    int a;
    public:
    A(){ 
        a = 100;
    }
    friend void add(A,B);
};   

class B{
    private:
    int b;
    public:
    B(){ 
        b = 100;
    }
    friend void add(A,B);
};

void add (A Aobj, B Bobj){
    cout << (Aobj.a + Bobj.b);
}

main(){
    A A1;
    B B1;
    add(A1,B1);
    return 0;
}

希望这会有所帮助!

【讨论】:

  • 非常感谢您,您的示例非常好且易于理解
【解决方案2】:

对于friendsclass 的哪些功能可以或不能是没有限制,所以是的,这没有问题。

【讨论】:

  • 嗯,你必须能够命名函数,但这是一个自然的限制。例如。 struct { static void foo(); }; 或其他翻译单元中匿名命名空间中的函数。
【解决方案3】:

对以上代码的更正

#include<iostream>
using namespace std;
class B;                   //defined later
class A;                  //correction (A also need be specified)
void add(A,B);

class A{
    private:
    int a;
    public:
    A(){
        a = 100;
    }
    friend void add(A,B);
};

class B{
    private:
    int b;
    public:
    B(){
        b = 100;
    }
    friend void add(A,B);
};

void add (A Aobj, B Bobj){
    cout << (Aobj.a + Bobj.b);
}

main(){
    A A1;
    B B1;
    add(A1,B1);
    return 0;
}

【讨论】:

    【解决方案4】:
    #include<iostream>
    
    using namespace std;
    
    class first
    {
        friend void getdata(first object1, int i);
    };
    
    class second
    {
        friend void getdata(second object2, int j);
    };
    
    getdata(first object1, int i, second object2, int j)
    {
        cout<<i+j;
    }
    
    main()
    {
        first object1;
        second object2;
        getdata(object1, 5, object2, 7);
    }
    

    【讨论】:

    • 好友函数旨在访问类私有成员
    猜你喜欢
    • 2021-02-13
    • 2011-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-04
    • 2011-09-24
    相关资源
    最近更新 更多