You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何检查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方法。

正确的写法有两种:

  1. 先解引用迭代器拿到存储的unique_ptr<Organism>,再通过->调用类方法:
(*attacked_organism)->get_coordinates();
  1. 通过迭代器的operator->间接访问存储的unique_ptr后再调用方法:
attacked_organism->get()->get_coordinates();

日常使用第一种写法更简洁普遍。

内容的提问来源于stack exchange,提问作者Michał Turek

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 06:45:02