首先是正确代码,接下来将在正确代码基础上进行修改:
//一个小技巧:类外声明函数最好最后写
#include<iostream>
using namespace std;
class building;
class person {
public:
person();
void visit();
private:
building* b;
};
class building {
friend void person::visit();
public:
building();
string bedroom;
private:
string sittingroom;
};
person::person(){
b = new building;
}
building::building() {
//这里发现了一个小bug分析,具体见下文
string bedroom = "卧室";
sittingroom = "客厅";
}
void person::visit() {
cout << "正在拜访: " << b->bedroom << endl;
cout << "正在拜访: " << b->sittingroom << endl;
}
void test01() {
person p;
p.visit();
}
int main() {
test01();
}
bug1:
注释掉24-26行,即构造函数未写出操作,但在类内写了函数调用
person::person(){
b = new building;
}
bug2:
注释掉第九行的构造函数调用,同时继续注释掉24-26行
class person {
public:
//person();
void visit();
private:
building* b;
};
//person::person(){
// b = new building;
//}
可以成功运行,但输出结果只有第一次cout的正在拜访
猜测原因:
1.b指针指向不定,野指针b
2.cout的链式结构,一处结束,全部结束 (猜测,不确定)
bug3: 第二十九行的小bug
对第二十八行到三十二行进行更改,对三十行的bedroom加上string类型声明
building::building() {
//这里发现了一个小bug分析
string bedroom = "卧室";
sittingroom = "客厅";
}
可以正常运行,但被string类型修饰的变量无法输出其储存的值
原因分析:在函数内声明后,bedroom变成了与该函数同时存在的临时变量,与类内的bedroom不同了,但sittingroom不会收到影响,由于未给临时变量bedroom赋值,故控制台无法显示输出值