c++友元-类中成员函数做友元的问题

问题:

以下是vs2022的报错:
已启动生成…
1>- 已启动生成: 项目: c_cplus, 配置: Debug x64 -
1>11友元.cpp
1>E:\workspaces\11友元.cpp(17,14):** error C2653: “GoodGay3”: 不是类或命名空间名称**
1>E:\workspaces\11友元.cpp(78,41): error C2248: “Building1::BedRoom”: 无法访问 private 成员(在“Building1”类中声明)
1>E:\workspaces\11友元.cpp(27):** message : 参见“Building1::BedRoom”的声明
1>E:\workspaces\11友元.cpp(9): message : 参见“Building1”的声明
1>已完成生成项目“c_cplus.vcxproj”的操作 - 失败。

= 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 =

以下是完整代码


#include <iostream>
#include <string>
using namespace std;
/*
 * 友元无传递性,对称性
 */


class Building1 {
    //1.友元函数
    friend void goodGay1(Building1* building1);

    //2.友元类
    friend class GoodGay2;

    //3.类成员友元函数
    friend void GoodGay3::visit_friend();
public:
    Building1() {
        this->BedRoom = "卧室";
        this->SittingRoom = "客厅";
    }

public:
    string SittingRoom;
private:
    string BedRoom;
};

//1.全局友元函数
void goodGay1(Building1 * building1) {
    cout << "1access :" << building1->SittingRoom << endl;
    cout << "1access :" << building1->BedRoom << endl;    //friend
};

//2.友元类
class GoodGay2{
public:
    //类外实现
    GoodGay2();
    //类内实现
    void visit() {
        cout << "2access:" << this->building2->SittingRoom << endl;
        //2.friend
        cout << "2access:" << this->building2->BedRoom << endl;
    }

    Building1* building2;
};
//类外实现
GoodGay2::GoodGay2() {
    this->building2 = new Building1();
}


//3.类中成员函数 友元类
class GoodGay3 {
public:
    //类内实现
    GoodGay3() {
        this->building3 = new Building1();
    }
    //类内实现
    void visit() {
        cout << "3.1access:" << this->building3->SittingRoom << endl;
        //not friend
        //cout << "2access:" << this->building2->BedRoom << endl;
    }
    //类外实现
    void visit_friend();

    Building1* building3;
};
//类外实现
void GoodGay3::visit_friend() {
    cout << "3.1.1access:" << this->building3->SittingRoom << endl;
    //friend
    cout << "3.2access:" << this->building3->BedRoom << endl;
}


void test111() {
    Building1* building1 = new Building1();
    goodGay1(building1);
    GoodGay2* goodGay2 = new GoodGay2();
    goodGay2->visit();
    GoodGay3* goodGay3 = new GoodGay3();
    goodGay3->visit();
    goodGay3->visit_friend();

}

int main() {
    test111();
    return 0;
}

调换了代码顺序后,问题已经解决。
但是对调换代码顺序就可成功的本质,还没有理解,求助 此代码调换顺序的本质原因


#include <iostream>
#include <string>
using namespace std;
/*
 * 友元无传递性,对称性
 */

class Building1;

 //3.类中成员函数 友元类
class GoodGay3 {
public:
    //类外实现
    GoodGay3();

    Building1* building3;

    // 貌似只能在 类实现
    void visit();
    //类外实现
    void visit_friend();

    
};

class Building1 {
    //1.友元函数
    friend void goodGay1(Building1* building1);

    //2.友元类
    friend class GoodGay2;

    //3.类成员友元函数
    friend void GoodGay3::visit_friend();
public:
    Building1() {
        this->BedRoom = "卧室";
        this->SittingRoom = "客厅";
    }

public:
    string SittingRoom;
private:
    string BedRoom;
};

//1.全局友元函数
void goodGay1(Building1 * building1) {
    cout << "1access :" << building1->SittingRoom << endl;
    cout << "1access :" << building1->BedRoom << endl;    //friend
};

//2.友元类
class GoodGay2{
public:
    //类外实现
    GoodGay2();
    //类内实现
    void visit() {
        cout << "2access:" << this->building2->SittingRoom << endl;
        //2.friend
        cout << "2access:" << this->building2->BedRoom << endl;
    }

    Building1* building2;
};
//类外实现
GoodGay2::GoodGay2() {
    this->building2 = new Building1();
}



//类外实现
GoodGay3::GoodGay3() {
    this->building3 = new Building1();
}
void GoodGay3::visit_friend() {
    cout << "3.1.1access:" << this->building3->SittingRoom << endl;
    //friend
    cout << "3.2access:" << this->building3->BedRoom << endl;
}
void GoodGay3::visit() {
    cout << "3.1access:" << this->building3->SittingRoom << endl;
    //not friend
    //cout << "2access:" << this->building2->BedRoom << endl;
}


void test111() {
    Building1* building1 = new Building1();
    goodGay1(building1);
    GoodGay2* goodGay2 = new GoodGay2();
    goodGay2->visit();
    GoodGay3* goodGay3 = new GoodGay3();
    goodGay3->visit();
    goodGay3->visit_friend();

}

int main() {
    test111();
    return 0;
}