C++类成员函数设计疑问:vector访问与参数传递选择
关于C++ Aquarium类成员函数设计的疑问解答
问题1:类中的fishes vector是应该传递给fishExists成员函数,还是直接在函数内访问?
直接在fishExists成员函数内访问类的私有成员fishes是更合理的设计,理由如下:
- 封装性保障:
fishes是Aquarium的内部存储细节,作为私有成员本就该对外隐藏。如果把它作为参数传递给fishExists,等于暴露了内部容器类型(比如vector),后续如果要替换成更高效的存储结构(比如unordered_set),所有调用fishExists的代码都要跟着修改,违反了开闭原则。 - 代码简洁性:成员函数本身就拥有访问类私有成员的权限,无需额外传递参数,代码更简洁易读,也减少了参数传递的开销。
- 安全性提升:避免外部代码通过参数引用意外修改
fishes的风险,只有类内部函数能操作这个容器,逻辑更可控。
问题2:fishExists函数是否应该接收Fish对象而非fishId作为参数?
这取决于你的业务使用场景,可以分情况处理:
- 如果业务中经常需要通过已有的Fish对象判断是否存在于水族箱中,重载一个接收Fish对象的版本会更方便,比如:
这样既保留了原有的按ID查询的高效版本,又增加了按对象查询的便利性。bool Aquarium::fishExists(const Fish* fish) { if (!fish) return false; // 空指针检查 return fishExists(fish->getId()); } - 如果大部分场景都是通过ID查询,或者Fish的ID是唯一标识,保留原有的按ID传递的版本更合适——直接传ID无需依赖Fish对象实例,逻辑更直接,也避免了空指针等额外风险。
原参考代码
class Aquarium { std::vector<Fish*> fishes; public: bool addFish(Fish* fish); bool fishExists(unsigned int fishId); }; bool Aquarium::addFish(Fish *fish) { if(fishExists(fish->getId())) { return false; } fish->setAquarium(this); fishes.push_back(fish); return true; } bool Aquarium::fishExists(unsigned int fishId) { auto it = std::find_if(fishes.begin(), fishes.end(), [fishId](const Fish* fish) { return fish->getId() == fishId; }); return it != fishes.end(); }
内容的提问来源于stack exchange,提问作者Tomás Ramos
相关产品推荐
相关产品推荐

