如何检查unique_ptr是否指向当前对象及调用其成员方法
问题解答
一、同坐标对象查找逻辑优化
你现有的查找思路是成立的,但有两个可优化/需要注意的点:
- 避免依赖类的重载运算符做身份判断:你当前用
*this != *attacked_organism排除自身的逻辑,依赖于Organism类正确重载了!=运算符。如果要更稳妥的直接判断是否为同一个对象,可以替换成this != attacked_organism.get(),直接比较指针地址,不会受运算符重载逻辑的影响。 - 必须加查找结果判空逻辑:
std::find_if如果没有找到匹配项,会返回传入的区间尾迭代器,直接访问尾迭代器的内容会触发未定义行为,所以拿到迭代器后必须先做判断:
if (attacked_organism != end(organism_vector)) { // 后续操作 }
优化后的完整查找代码示例:
auto& organism_vector = world->get_vector(); auto attacked_organism = find_if( begin(organism_vector), end(organism_vector), [this](const unique_ptr<Organism>& item) { return this->get_coordinates() == item->get_coordinates() && this != item.get(); });
二、迭代器调用类方法的正确写法
你当前的写法*attacked_organism.get_coordinates();是错误的,原因是C++运算符优先级中.的优先级高于*,代码实际会被解析为*(attacked_organism.get_coordinates()),但attacked_organism是迭代器本身,并没有get_coordinates方法。
正确的写法有两种:
- 先解引用迭代器拿到存储的
unique_ptr<Organism>,再通过->调用类方法:
(*attacked_organism)->get_coordinates();
- 通过迭代器的
operator->间接访问存储的unique_ptr后再调用方法:
attacked_organism->get()->get_coordinates();
日常使用第一种写法更简洁普遍。
内容的提问来源于stack exchange,提问作者Michał Turek
相关产品推荐
相关产品推荐

