在学习类类型转换为类类型的时候,发现一个错误,在老师的讲解下理解了原因
错误1:将boy赋值给man时,man中的构造函数中的参数用的普通类型(Boy boy) 没有使用引用类型,在释放boy中name的内存地址时报错
代码:
#pragma once
#include <iostream>
using namespace std;
class Boy;
class Man
{
public:
Man(Boy boy); //没有使用引用类型
~Man();
friend ostream &operator<<(ostream &os, const Man &man);
private:
char *name;
int age;
int salary;
};
main中的代码:Man man(boy)
此时相当于是赋值操作,将实参boy赋给构造函数中的形参boy,但boy中的name是指针类型。我们也没有自定义拷贝构造函数,因此在赋值的过程中,调用了默认的拷贝构造函数,属于浅拷贝,会将boy中name的地址也拷贝到形参boy中,但形参的生命周期在执行完man的构造函数后就结束了,我们在析构函数中进行内存释放,然而形参指向的内容和实参相同,所以实参的内容也被释放,导致了报错
更改方法,使用引用:Man(Boy &boy);
错误2:寻找最佳伴侣的一个方法中,伴侣为一个指针,初值为空指针,当为空的时候会将遍历到的第一个值赋值给伴侣指针。不为空的时候进行一个比较,将更好的那个赋给伴侣指针
刚开始的做法是将指针解引,把比较后更好的赋值给解引的指针,由于指针已经有一个初值,直接解引后赋值会把指针指向的初始内容更改了,导致错误
void DataBase::bestAutoMatch()
{
cout << "匹配最佳伴侣" << endl;
string line = string(100, '-');
Boy *bestBoy = NULL;
Girl *bestGirl = NULL;
cout << line << endl;
for (int i = 0; i < boys.size(); i++) {
for (int j = 0; j < girls.size(); j++) {
if (boys[i].satisfied(girls[j]) && girls[j].satisfied(boys[i])) {
if (!bestGirl) { //如果bestgirl为空,赋值第一个满足的女生为最佳伴侣
bestGirl = &girls[j];
}else if(girls[j] > * bestGirl){
*bestGirl = girls[j]; //直接更改了bestGirl指向的内容
}
}
}
if (bestGirl) { //判断是否有最佳的伴侣
cout << boys[i] << endl;
cout << *bestGirl << endl;
cout << line << endl;
}
}
for (int i = 0; i < girls.size(); i++) {
for (int j = 0; j < boys.size(); j++) {
if (girls[i].satisfied(boys[j]) && boys[j].satisfied(girls[i])) {
if (!bestBoy) { //如果bestBoy为空,赋值第一个满足的男生为最佳伴侣
bestBoy = &boys[j];
}
else if (boys[j] > * bestBoy) {
*bestBoy = boys[j];
}
}
}
if (bestBoy) {
cout << girls[i] << endl;
cout << *bestBoy << endl;
cout << line << endl;
}
}
}
解决方法,比较后更好的直接指针指向新的(这个更好的)地址:bestGirl = &girls[j];