返回“const std :: string&”的方法有错误检查

时间:2011-02-16 19:27:23

标签: c++

我正在写一个函数,我想返回“const std :: string&”。我们来看看代码。

class A
{
public:
    const std::string& GetString() const
    {
        if (list.empty())
        {
            return "Warning!";    // how to get around this line.
        }
        return list[0];
    };
protected:
    std::vector<std::string> list;
};

以上代码就是一个例子。基本思想是编写一个返回const引用的函数,但也能够检查错误。

那么,如何绕过“返回”警告!“;”?

谢谢,

5 个答案:

答案 0 :(得分:5)

if (list.empty()) {
    static std::string w("Warning!");
    return w;
}

因为你要返回一个const引用,所以你总是返回对同一个对象的引用并不重要。

答案 1 :(得分:2)

如果您对使用字符串引用感兴趣,为什么不将字符串引用作为参数并返回布尔成功/失败标志?

class A
{
public:
    const bool GetString(std::string& outString) const
    {
        if (list.empty())
            return false;

        outString = list[0];
        return true;
    };
protected:
    std::vector<std::string> list;
};

获得相同的结果,并给出一个简单的布尔结果。

编辑:正如Ferruccio指出的那样,这不是一个可以掉以轻心的方法。以这种方式使用参数输出容易引起混淆和错误,应谨慎使用,并在使用时记录良好。

答案 2 :(得分:1)

如果你真的想避免使用例外(这是我的第一选择),你可以考虑这个:

class A
{
public:
    const std::string& GetString() const
    {
        if (list.empty())
        {
            return warning;
        }
        return list[0];
    };
protected:
    std::vector<std::string> list;

private:
    static std::string warning;
};

// in *.cpp
std::string A::warning = "warning";

答案 3 :(得分:0)

您可能会在此函数中抛出异常并添加一个函数来检查列表是否为空。然后呼叫者可以在呼叫GetString()之前进行检查。但如果他们不这样做,他们会得到一个他们不能忽视的例外。

答案 4 :(得分:0)

如果您不想使用异常(有任何方式的优点和缺点),我首先要问是否要求调用者首先调用“isValid”方法是合理的。

class A
{
public:
    bool IsStringValid() const
    {
         return !list.empty();
    }
    const std::string& GetString() const
    {
        if (list.empty())
        {
            return "";
        }
        return list[0];
    };
protected:
    std::vector<std::string> list;

private:
    static QString warning;
};

如果是我,我可能会返回const std::string*而不是NULL是一个选项,或者像Fiktik建议的那样定义一个标记值。