Exercise 3代码问题反馈:C++类继承相关代码异常求助
排查你的C++类继承代码问题
我帮你梳理了这段代码里的几个关键问题,一个个拆解来看:
set_data函数中strcpy参数顺序完全颠倒
你现在写的是strcpy(b,name);,但strcpy的规则是「目标地址在前,源地址在后」——这里你本来是想把传入的名字复制到Animal类的name成员里,所以正确写法应该是strcpy(name, b);。原来的写法会把未初始化的name数组内容(随机垃圾值)复制到参数b里,不仅逻辑全错,还会触发未定义行为。message_zebra函数的输出语句语法不完整
你写的cout<< "The zebra named "<< name <<" is "<< age << " years old....缺少了闭合的双引号和语句结束的分号,正确的完整写法是:cout << "The zebra named " << name << " is " << age << " years old." << endl;字符串参数的安全性优化建议
函数set_data的参数char b[10]在实际调用时会退化为char*,如果传入字符串字面量(比如"Ziggy"),编译器大概率会抛出警告——因为字符串字面量是const类型的。建议把参数改成const char* b更规范。另外,name是长度为10的char数组,直接用strcpy如果传入的名字超过9个字符(要留一个位置存字符串结束符'\0')会导致缓冲区溢出,改用strncpy并手动添加结束符会更安全;或者直接用std::string代替char数组,既省心又能避免这类问题。
修正后的完整代码示例
#include <iostream> #include <cstring> using namespace std; class Animal { protected: int age; char name[10]; public: // 修正strcpy顺序,同时把参数改为const char* void set_data(int a, const char* b) { age = a; // 使用strncpy避免缓冲区溢出,手动补全结束符 strncpy(name, b, sizeof(name) - 1); name[sizeof(name) - 1] = '\0'; } }; class Zebra: public Animal { public: void message_zebra() { // 补全输出语句的引号和分号 cout << "The zebra named " << name << " is " << age << " years old." << endl; } }; // 测试用主函数 int main() { Zebra z; z.set_data(5, "Ziggy"); z.message_zebra(); return 0; }
如果换成std::string的版本会更简洁安全,这里也给你参考:
#include <iostream> #include <string> using namespace std; class Animal { protected: int age; string name; public: void set_data(int a, const string& b) { age = a; name = b; } }; class Zebra: public Animal { public: void message_zebra() { cout << "The zebra named " << name << " is " << age << " years old." << endl; } }; int main() { Zebra z; z.set_data(5, "Ziggy"); z.message_zebra(); return 0; }
内容的提问来源于stack exchange,提问作者Fornax-A
相关产品推荐
相关产品推荐

