我正在练习编码,并创建了一个“伙伴”程序,其中一个对象可以有一个名称和一个伙伴,该伙伴包含另一个名为“伙伴”的对象的地址。
这是我的课程:
class Buddy {
public:
Buddy() {
name = "NoName";
}
Buddy(string newName) {
name = newName;
}
void setName(string newName) {
name = newName;
}
string getName() {
return name;
}
void setBuddy(Buddy buddy2) {
buddy = &buddy2;
}
string getBuddyName() {
return buddy->getName();
}
private:
string name;
Buddy *buddy = NULL;
};
在我的主文件中,我为Buddy“ a”分配了一个名为“ b”的伙伴:
a.setBuddy(b);
b.setBuddy(a);
然后,我想通过分配给他们的伙伴来列出各个对象的名称,但是我在这部分上崩溃了。这是代码:
cout << "A's Buddy: " << a.getBuddyName() << endl;
cout << "B's Buddy: " << b.getBuddyName() << endl;
这行不行吗?我想,我正确地传递了参考。你能帮我发现任何错误吗?
答案 0 :(得分:0)
尝试以下修复程序:
void setBuddy(Buddy& buddy2) { // an actual reference, not a copy of the original
buddy = &buddy2;
}
string getBuddyName() {
return buddy ? buddy->getName() : string("");
}
setBuddy
的问题在于它存储了其参数的地址,即一个临时对象(在调用函数时复制),该对象在函数返回后将无效。并且getBuddyName
在取消引用之前没有检查空的buddy
指针。