前言:最近学习完C++的一些基本知识之后,开始了C++核心编程内容的学习。学习到了类和对象的部分。其中,在昨天学到友元的时候,遇到了一个问题,我就写了两个类,只不过这次把类的成员函数的实现写在了类外。本来想着的是,反正后面学习会把声明和定义分开写成.h和.cpp文件,就寻思先试试把定义分出来写提前熟悉一下。没想到,程序运行结果报错,然后我又把类外实现改回了类内实现,还是报错!简直小搞我一波。
这个案列主要是讲成员函数做友元。先定义分别定义两个类,在一个类中添加另一个类的成员函数做友元,让另一个类通过成员函数访问该类的私有属性。首先给出常规思维的代码:
#include<iostream>
using namespace std;
#include< string>
class person2 ;//声明一个person类
class Goodfriend1
{
public:
Goodfriend1()
{
//创建一个对象
pers = new person2;
}
void visit1()//让成员函数访问person2中的私有属性
{
cout << "好朋友在访问" << pers->sittingRoom << endl;
cout << "好朋友在访问" << pers->bedRoom << endl;
}
void visit2()//不可以访问person2中的私有属性
{
//测试函数
cout << "好朋友在访问" << pers->sittingRoom << endl;
cout << "好朋友在访问" << pers->bedRoom << endl;
}
public:
person2* pers;
};
class person2
{
friend void Goodfriend1::visit1();
public:
person2()//无参构造声明
{
this->sittingRoom = "客厅";
this->bedRoom = "卧室";
}
public:
string sittingRoom;
private:
string bedRoom;
};
void TEST02()
{
Goodfriend1 gg;
gg.visit1();
//gg.visit2();
}
int main()
{
TEST02();
system("pause");
return 0;
}
常规思维的写法就是这样,但是大家去运行程序。会惊奇的发现,程序跑不通!!!他会告诉我们pers这个对象没有构造函数!是不是大眼瞪小眼,挺懵逼的。
这个地方我个人的理解是这样的:程序中的代码是有着执行顺序的。如果我们在声明两个类的同时并且在类中进行定义,当两个类中互相有对方的类中成员的声明语句时。因为已经在类中进行了定义,所以编译器会顺着代码依次执行,当类中出现的别的类中的成员声明语句时,编译器找不到相应的定义就会报错!在这种情况下我们必须将各个类的声明和定义分开编写!编译器才知道我们的意思。修改后的代码如下:
#include<iostream>
using namespace std;
#include< string>
class person2 ;//声明一个person类
class Goodfriend1
{
public:
Goodfriend1();
void visit1();//让成员函数访问person2中的私有属性
void visit2();//测试函数
public:
person2* pers;
};
class person2
{
friend void Goodfriend1::visit1();
public:
person2();//无参构造声明
public:
string sittingRoom;
private:
string bedRoom;
};
person2::person2() //类外实现person类的无参构造函数
{
this->sittingRoom = "客厅";
this->bedRoom = "卧室";
}
Goodfriend1::Goodfriend1()//类外实现Goodfriend类构造函数
{
//创建一个对象
pers = new person2;
}
void Goodfriend1:: visit1()
{
cout << "好朋友在访问" << pers->sittingRoom << endl;
cout << "好朋友在访问" << pers->bedRoom << endl;
}
//void Goodfriend1:: visit2()
//{
//cout << "好朋友在访问" << pers->sittingRoom << endl;
//cout << "好朋友在访问" << pers->bedRoom << endl;
//}
void TEST02()
{
Goodfriend1 gg;
gg.visit1();
//gg.visit2();
}
int main()
{
TEST02();
system("pause");
return 0;
}
运行代码就显示正常拉。
最终总结就是:当两个类中互相有着对方类中成员的声明时,需要将全部声明和相关的定义分开编写,这样编译器才能正确理解我们的意图。
写到这里突然想起来还没解释开头的时候我说写在类外实现还是报错的原因。
这里其实就比较呆了,我是把每个类的类外定义紧接着写在类的声明下的。也就是类声明,类定义,类声明,类定义的顺序。因为c++要求声明之间不可以出现定义,所以函数还是报错了。所以经过此次教训后,要学会把所有的全部的声明和全部的定义分开来写,我想这也是声明写在.h文件和定义写在.cpp文件的原因吧。
标签:定义,sittingRoom,注意事项,C++,person2,Goodfriend1,bedRoom,声明 From: https://blog.csdn.net/weixin_55017074/article/details/143171680