我被告知如果没有给出解释就创建这样的课程是错误的,花了很多时间后,我无法弄清楚原因。
class Dog {
public:
Dog (char const* n) : dog_name(n) {}
~Dog() {}
char const* getDogName() const
{
return dog_name;
}
private:
char const* dog_name;
};
答案 0 :(得分:1)
使用您的班级考虑以下代码:
char *name = new char[5];
strcpy(name, "Fido");
Dog fido(name);
delete name;
std::cout << fido.getDogName() << '\n'; // Oops -- undefined behavior!
实例fido
仍然指向已删除的char
数组。这是dangling pointer,导致nasal demons。
或另一个问题:
char name[32];
strcpy(name, "Fido");
Dog fido(name);
strcpy(name, "Rover");
Dog rover(name);
std::cout << fido.getDogName() << '\n'; // Why does this print "Rover"?
std::cout << rover.getDogName() << '\n';
这两个实例都指向同一个缓冲区。当你改变它时,它将Fido的名字改为Rover。糟糕。
一种解决方案是在类中创建自己的char
缓冲区,而不仅仅是一个指针,并将strcpy
数据放入其中(仔细检查范围,这样就不会超出缓冲区!)。或者只是避免所有这些废话,并使用std::string
,这更有意义。