如何遍历并打印C++自定义类返回对象的成员信息
问题解决:打印Person对象成员与模糊查找匹配
1. 打印Person对象的姓名、年龄等成员信息
如果你的Person类成员(比如name、age)是private权限,外部代码无法直接访问,最规范的做法是给类添加公共的getter方法,用于获取成员值。
修改Person类示例
#include <string> #include <iostream> class Person { private: std::string name; int age; public: // 构造函数 Person(std::string n, int a) : name(n), age(a) {} // 获取姓名的getter方法 std::string getName() const { return name; } // 获取年龄的getter方法 int getAge() const { return age; } };
找到对象后打印信息
假设findPerson返回的是Person指针(推荐用指针/引用,避免拷贝且能处理未找到的情况):
// 调用findPerson获取匹配对象 Person* foundPerson = list.findPerson("Vitalik"); // 先判断是否找到对象,再打印 if (foundPerson != nullptr) { std::cout << "姓名:" << foundPerson->getName() << std::endl; std::cout << "年龄:" << foundPerson->getAge() << std::endl; } else { std::cout << "未找到匹配人员" << std::endl; }
如果findPerson返回的是Person对象(需确保找到时才返回,否则会有默认构造问题),直接调用getter即可:
Person foundPerson = list.findPerson("Vitalik"); std::cout << "姓名:" << foundPerson.getName() << std::endl; std::cout << "年龄:" << foundPerson.getAge() << std::endl;
2. 实现模糊查找匹配全名"Vitalik Buterin"
你的findPerson方法应该是在做精确字符串匹配,所以输入"Vitalik"无法匹配"Vitalik Buterin"。只需修改匹配逻辑,检查目标姓名是否包含输入的子串即可。
修改listOfPeople的findPerson方法
假设peopleList是存储Person的容器(比如std::vector<Person>):
#include <vector> #include <string> class listOfPeople { private: std::vector<Person> peopleList; public: // 添加人员到列表 void addPerson(const Person& p) { peopleList.push_back(p); } // 模糊查找:返回第一个包含子串的Person指针 Person* findPerson(const std::string& searchSubstr) { for (auto& person : peopleList) { // 检查姓名中是否包含目标子串 if (person.getName().find(searchSubstr) != std::string::npos) { return &person; } } // 未找到返回空指针 return nullptr; } };
可选:忽略大小写的模糊匹配
如果需要不区分大小写(比如输入"vitalik"也能匹配),可以添加字符串转小写的辅助逻辑:
#include <algorithm> #include <cctype> // 辅助函数:将字符串转为全小写 std::string toLower(std::string str) { std::transform(str.begin(), str.end(), str.begin(), [](unsigned char c){ return std::tolower(c); }); return str; } // 修改findPerson为忽略大小写的模糊匹配 Person* listOfPeople::findPerson(const std::string& searchSubstr) { std::string lowerSubstr = toLower(searchSubstr); for (auto& person : peopleList) { std::string lowerName = toLower(person.getName()); if (lowerName.find(lowerSubstr) != std::string::npos) { return &person; } } return nullptr; }
内容的提问来源于stack exchange,提问作者ThisIsMe
相关产品推荐
相关产品推荐

