返回set中unique_ptr的引用

时间:2014-05-23 07:30:31

标签: c++ set unique-ptr

我有一个类Entity,并且该类有一个名为componentSet的属性。这是另一个类Component的unique_ptr集合。每个组件对象都有一个名为actionStringSet的属性,一个包含字符串的集合。

我想要做的是为Entity编写一个带有字符串参数的成员函数,并返回对actionStringSet中该字符串中任何一个组件的引用。它们应该是唯一的,所以如果它不止一个,我就不需要任何特殊处理。另外,如果没有任何组件有这个字符串,我不知道该怎么办。

到目前为止我所拥有的是:

Component& Entity::get_component_for_action(std::string actionStr) {
    std::cout << componentSet.size() << std::endl;
    for (auto& comp : componentSet) {
        std::cout << comp->name;
        if (comp->actionStringSet.count(actionStr)) {
            return comp;
        }
    }
    throw;
}

如果没有找到任何内容,我将在python中执行的操作返回None。我不能在这里做到这一点,所以我的第一个是提出错误,并在所有来电者中捕获。但我很确定不应该在c ++中使用异常。

无论如何,上面的代码都不会编译,说

/home/jagoly/Projects/sqee/libsqee/logic/entity.cpp:20: error: non-const lvalue reference to type 'sq::Component' cannot bind to a value of unrelated type 'const std::unique_ptr<sq::Component, std::default_delete<sq::Component> >'
            return comp;
                   ^~~~

但是这会尝试返回指针本身。我想改变其他所有内容以期待unique_ptr,但后来我发现错误已经删除了(我假设传递指针并不是一个好主意)。

无论如何,我应该改变什么?它只是该函数中的一小部分语法,我是否需要更改我的数据类型,或者我的方法是否从根本上是错误的?

谢谢你提前:)

1 个答案:

答案 0 :(得分:0)

您应取消引用unique_ptr以获取对指向值的引用:

return *comp;

请注意,如果unique_ptr释放其值,此引用将无效,因此您应该注意componentSet元素相对于返回引用的元素的生命周期。