使用指针或引用来检查是否包含对象

时间:2016-03-15 17:09:57

标签: c++

我有一个拥有传感器矢量的Simulation类。您希望containsSensor1(const Sensor* iSen)containsSensor2(const Sensor& iSen)检查是否包含传感器?通常我总是喜欢const引用函数,但在这种情况下我不确定哪一个更方便。

#include <vector>
#include <memory>
#include <algorithm>
#include <iostream>

class Sensor
{
};

class Simulation
{
    std::vector<std::unique_ptr<Sensor>> sensors;

public:
    void addSensor(std::unique_ptr<Sensor> iSen)
    {
        sensors.push_back(std::move(iSen));
    }
    bool containsSensor1(const Sensor* iSen) const
    {
        bool rv = false;
        for (auto itr = sensors.begin(); itr != sensors.end(); ++itr)
        {
            if (itr->get() == iSen)
            {
                rv = true;
                break;
            }
        }
        return rv;
    }
    bool containsSensor2(const Sensor& iSen) const
    {
        bool rv = false;
        for (auto itr = sensors.begin(); itr != sensors.end(); ++itr)
        {
            if (itr->get() == &iSen)
            {
                rv = true;
                break;
            }
        }
        return rv;
    }    
};

int main()
{
    std::unique_ptr<Sensor> sen1 = std::make_unique<Sensor>();
    const Sensor* sen1Ptr = sen1.get();
    Simulation sim;
    sim.addSensor(std::move(sen1));

    bool contains1 = sim.containsSensor1(sen1Ptr);
    bool contains2 = sim.containsSensor2(*sen1Ptr);

    std::cout << contains1 << "\n" << contains2 << std::endl;
    return 0;
}

更新的 我不想检查对象是否相等。我只是想知道之前添加的传感器是否仍包含在模拟对象中(实际上还有removeSensor函数)

2 个答案:

答案 0 :(得分:1)

我认为从参考方法中可以看出,您尝试在Simulation中查找匹配的Sensor对象,而不是尝试可能与指针本身匹配。

使用vector<Sensor>然后使用传感器移动构造函数将Sensor移动到矢量中可能不那么复杂。那你肯定会使用参考方法。将其与std::find组合以检查对象是否存在于向量中。

答案 1 :(得分:0)

这完全是主观的。我喜欢它的参考,但是,假设你被锁定使用对象的地址作为唯一ID,老实说,你可以做任何你喜欢的。