C++中shared_ptr返回对象时未找到匹配类的返回方式咨询
未找到匹配对象时,直接返回nullptr即可,这是std::shared_ptr表示“空”的标准方式,完全符合你“未找到返回空”的需求。
为什么你原来的写法不对
你当前写的return std::make_shared<myClass>(nullptr);会创建一个新的myClass对象并返回指向它的shared_ptr,这不是“空”,反而会额外分配内存;而且你的myClass并没有接受nullptr的构造函数,这段代码本身会编译失败。
修正后的完整代码
首先需要修正myClass的成员访问权限(否则getMyClass无法访问name),然后修改返回逻辑:
#include <vector> #include <memory> #include <string> #include <algorithm> // 可选,用于简化查找逻辑 std::vector<std::shared_ptr<myClass>> myClasses; class myClass{ public: // 设为public,或提供getter方法来访问name std::string name = "bob"; myClass() = default; // 显式默认构造函数,确保对象可正常创建 }; std::shared_ptr<myClass> getMyClass(const std::string& _name){ // 原始循环写法 for (const auto& x : myClasses){ if (x->name == _name){ return x; } } return nullptr; // 未找到返回空指针 // 可选:用std::find_if简化代码,更简洁 /* auto it = std::find_if(myClasses.begin(), myClasses.end(), [&_name](const std::shared_ptr<myClass>& ptr) { return ptr->name == _name; }); return (it != myClasses.end()) ? *it : nullptr; */ }
额外说明
- 返回
nullptr后,调用者可以通过if (auto ptr = getMyClass("alice"))这类写法判断是否找到对象,符合C++惯用逻辑。 - 若你的C版本是C17及以上,也可以考虑返回
std::optional<std::shared_ptr<myClass>>,语义更明确,但返回nullptr的方式已经足够简洁且兼容更早的C++标准。
内容的提问来源于stack exchange,提问作者Marty Vestor
相关产品推荐
相关产品推荐

