问题:
以下是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;
}