【问题标题】:how to check if unique_ptr points to this如何检查 unique_ptr 是否指向此
【发布时间】:2021-12-02 05:10:36
【问题描述】:

按照代码的和平,我试图找到另一个与this具有相同坐标的对象。如何正确操作?

        auto& organism_vector = world->get_vector();
        auto attacked_organism = find_if(begin(organism_vector), end(organism_vector), [this](const unique_ptr<Organism>& attacked_organism)
            {
                return this->get_coordinates() == attacked_organism->get_coordinates() && *this != *attacked_organism;
            });

另外一件事,当我终于设法得到这个迭代器时,如何引用attacked_organism 类方法?

*attacked_organism.get_coordinates();

【问题讨论】:

  • 迭代器在很多情况下可以像指针一样使用。根据运算符类型,某些操作不可用,但通常增量(++)、解引用(一元*)和箭头运算符可用作(in)等式检查(==!=;这些比较但是位置,而不是那些位置的对象)。特别是下面的循环应该使用每个迭代器类型的迭代器替换的指针:int array[10] {...}; auto pos = std::begin(array); auto const end = std::end(array); while (pos != end) { std::cout &lt;&lt; *array &lt;&lt; '\n'; ++pos; }
  • 在您的最后一个代码 sn-p 中,* 运算符应用 . 运算符,因为运算符优先级,使得表达式无效的。此外,你有一个 unique_ptr 的迭代器,所以这是另一个取消引用的级别:(**attacked_organism).get_coordinates();*attacked_organism 的类型是std::unique_ptr&lt;Organism&gt;&amp;,再次取消引用你有一个可以使用的Organism&amp; 类型的表达式使用. 运算符)
  • @fabian 如果我想使用 -> 运算符怎么办?
  • 你可以在std::unique_ptr&lt;Organism&gt;&amp;类型的表达式上使用它:(*attacked_organism)-&gt;get_coordinates();

标签: c++ c++11 vector this unique-ptr


【解决方案1】:

*this != *attacked_organism 更改为this != attacked_organism.get()

auto& organism_vector = world->get_vector();
auto attacked_organism = find_if(begin(organism_vector), end(organism_vector),
    [this](const unique_ptr<Organism>& attacked_organism)
    {
        return this->get_coordinates() == attacked_organism->get_coordinates() && this != attacked_organism.get();
    }
);

一旦您拥有find_if() 返回的iterator(并且在您确认它不是end 迭代器之后),您可以通过首先取消引用迭代器来访问@987654328 来调用Organism 上的方法@ 持有Organism* 指针,然后取消引用unique_ptr 以访问Organism 本身:

auto attacked_organism = find_if(...);
if (attacked_organism != end(organism_vector))
{
    (**attacked_organism).get_coordinates();
    or:
    (*attacked_organism)->get_coordinates();
    ...
}

附带说明:我不建议您将迭代器变量与 lambda 参数同名。这只会让事情变得令人困惑。 lambda 试图找到一个Organism 进行攻击,但它实际上还没有被攻击,所以你应该更恰当地命名 lambda 参数,例如:

auto attacked_organism = find_if(begin(organism_vector), end(organism_vector),
    [this](const unique_ptr<Organism>& candidate_organism)
    {
        return this->get_coordinates() == candidate_organism->get_coordinates() && this != candidate_organism.get();
    }
);

就此而言,我也不建议将迭代器命名为attacked_organism。这不是实际的Organism,它是iteratorOrganism,所以更像这样的东西会更具可读性:

auto& organism_vector = world->get_vector();
auto found_iterator = find_if(begin(organism_vector), end(organism_vector),
    [this](const unique_ptr<Organism>& candidate_organism)
    {
        return this->get_coordinates() == candidate_organism->get_coordinates() && this != candidate_organism.get();
    }
);
if (found_iterator != end(organism_vector))
{
    auto &attacked_organism = *found_iterator;
    attacked_organism->get_coordinates();
    ...
}

【讨论】:

  • 请检查我的修改,因为还有一件事我没有得到
  • @MichałTurek 更新
猜你喜欢
  • 2021-12-30
  • 1970-01-01
  • 2013-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-07
  • 2020-03-29
相关资源
最近更新 更多