我看黑马视频学习的时候喜欢看完一集再把代码默写出来,当我学到友元的时候,默写出来的代码如下,
#include <iostream>
using namespace std;
class GoodGay;
// Building 类的定义
class Building {
friend void GoodGay::visit();
// 声明 GoodGay 的 visit 函数为友元函数
public:
Building(); // 构造函数
string m_SittingRoom; // 客厅
private:
string m_BedRoom; // 卧室
};
// GoodGay 类的定义
class GoodGay {
public:
GoodGay(); // 创建Building对象
void visit(); // 访问Building对象的成员属性
private:
Building* building; // 指向 Building 类型的指针
};
// GoodGay 类成员函数的实现
GoodGay::GoodGay() {
building = new Building; // 实例化 Building 类的对象
}
// Building 类成员函数的实现
Building::Building() {
this->m_SittingRoom = "客厅";
this->m_BedRoom = "卧室";
}
void GoodGay::visit() {
cout << "好基友正在访问" << building->m_SittingRoom << endl;
cout << "好基友正在访问" << building->m_BedRoom << endl;
}
/*********************主方法************************/
int main() {
GoodGay gg;
gg.visit();
system("pause");
return 0;
}
C2027报错:使用了未定义类型GoodGay,可是我不是使用了类的向前声明了嘛
原因如下:
使用类的向前声明需要注意:使用向前声明之后,在类定义之前,类是一个不完全类型(incompete type),即仅仅已知向前声明过的类是一个类型,但仍然未实例化,所以在使用向前声明后,类定义前,只能定义指向该类型的指针或引用而不能使用该类成员。
解决方式:
调换类定义的顺序即可
#include <iostream>
using namespace std;
class Building;
// GoodGay 类的定义
class GoodGay {
public:
GoodGay(); // 创建Building对象
void visit(); // 访问Building对象的成员属性
private:
Building* building;
// 使用类的向前声明后,类的定义前,可以使用该类型的指针
};
// Building 类的定义
class Building {
friend void GoodGay::visit();
// 声明 GoodGay 的 visit 函数为友元函数
public:
Building(); // 构造函数
string m_SittingRoom; // 客厅
private:
string m_BedRoom; // 卧室
};
// GoodGay 类成员函数的实现
GoodGay::GoodGay() {
building = new Building; // 实例化 Building 类的对象
}
// Building 类成员函数的实现
Building::Building() {
this->m_SittingRoom = "客厅";
this->m_BedRoom = "卧室";
}
void GoodGay::visit() {
cout << "好基友正在访问" << building->m_SittingRoom << endl;
cout << "好基友正在访问" << building->m_BedRoom << endl;
}
/*********************主方法************************/
int main() {
GoodGay gg;
gg.visit();
system("pause");
return 0;
}