在成本字符串&中返回NULL功能

时间:2014-10-27 17:10:44

标签: c++

我需要在C ++上编写自己的哈希映射。它有一个方法.get(" some_string")如果这个字符串不在我的hash_map中,我返回NULL。但是如果此函数返回NULL或字符串,我无法检查我的程序。这是我的代码:

if (m.get("some_string"))
    cout << m.get("some_string");

和方法:

const string& Map::get(const string& s) {
    string_node* pos = find_pos(s);

    if (pos)
        return pos->val;
    else
        return NULL;
}

pos-&gt; val只是一个字符串。所以我有一个错误,我无法从const字符串转换为bool。 问题是我需要做什么,以防止cout中的错误,然后我的函数返回NULL。我怎么检查呢?

4 个答案:

答案 0 :(得分:6)

您无法为const string&返回空值。您必须返回对实际字符串对象的引用,该对象将在函数返回后继续生效。

选项:

  • 返回const string *,可以为空

  • 在null情况下抛出异常。

  • 按值返回一个字符串,并在null情况下返回一个空(但有效)的字符串。这有两个缺点。它会复制结果,您无法再识别空案例和真正的空字符串值,而无需从函数中输出更多信息。

答案 1 :(得分:1)

引用不能为null,因此从函数返回NULL是没有意义的。同样,您使用const string&作为条件,因此它尝试将其转换为bool,但没有合适的转换。相反,返回一个空字符串并检查返回值是否等于:

if (pos)
    return pos->value;
else
    return "";


if( m.get("some_string") == "" ) { ... }

如果空字符串是有效值,则可以使用输出参数:

bool Map::try_get( const string& key, string& value )
{
    string_node* pos = find_pos(s);

    if (pos)
    {
        value = pos->val;
        return true;
    }
    else
    {
       value = "";
       return false;
    }
}

答案 2 :(得分:0)

如果要返回引用,则无法返回NULL。你可以有一个特殊的回归案例。让它返回一个空字符串引用,表示哈希不存在。

答案 3 :(得分:0)

处理可选返回值的一种方法是使用Boost.Optional。您可以像这样使用它:

boost::optional<std::string> Map::get(const std::string& s) {
     // ...
}

int main()
{
    if (boost::optional<std::string> os = map.get("asdf"))
    {
        // *os
    }
}