0

我正在尝试编写一个非常简单的代码作为练习。问题是当我将一个类的成员函数设为另一个类的成员函数时,它说无法访问,但是当我将整个类声明为另一个类的朋友时,它工作正常。

#include <iostream>
using namespace std;
class gpa2;
class gpa1 {
private:
    int no1;
    int no2;
public:
    void setnum1(int n1, gpa2&xp) {
        cout << " the friend member function is : " << xp.no4;
    }
    void setnum2(int n2) {
        no2 = n2;
        cout << "num2 is : " << no2 << endl;
    };
};

class gpa2 {
private:
    int no3;
    int no4;
    friend void gpa1::setnum1(int, gpa2&);
public:
    void setnum3(int n3) {
        no3 = n3;
        cout << "num3 is : " << no3 << endl;
    }
    void getnum4(int n4) {
        cout << "num4 is :  " << n4 << endl;
    }
};

int main() {
    gpa1 g1;
    gpa2 g2;
    g1.setnum1(15, g2);
    g1.setnum2(30);
    g2.setnum3(45);
    g2.getnum4(50);
    return 0;
}
4

1 回答 1

0

xp.no4不可访问,因为setnum1是 的成员函数gpa1,不是gpa2

setnum1(int, gpa2&)定义的时候不需要实现函数,这里会出现问题: 定义的时候class gpa1 setnum1不能实现,因为class gpa2还没有定义。但是在定义之后实现它gpa2完全没有问题。

因此,有一些小的变化:Godbolt 示例

#include <iostream>
using namespace std;

// forward declaration
class gpa2;

class gpa1 {
private:
    int no1;
    int no2;
public:
    void setnum1(int n1, gpa2& xp);
    void setnum2(int n2) {
        no2 = n2;
        cout << "num2 is : " << no2 << endl;
    };
};

class gpa2 {
private:
    int no3;
    int no4;
    friend void setnum1(int, gpa2&);
public:
    void setnum3(int n3) {
        no3 = n3;
        cout << "num3 is : " << no3 << endl;
    }
    void getnum4(int n4) {
        cout << "num4 is :  " << n4 << endl;
    }

    int num4() { return no4; } // added accesibility to no4
};

// implementation of setnum1
void gpa1::setnum1(int n1, gpa2& xp)  {
    cout << " the friend member function is : " << xp.num4();
}



int main() {
    gpa1 g1;
    gpa2 g2;
    g1.setnum1(15, g2);
    g1.setnum2(30);
    g2.setnum3(45);
    g2.getnum4(50);
    return 0;
}

于 2020-07-04T07:00:56.443 回答