我正在写一个函数,我想返回“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引用的函数,但也能够检查错误。
那么,如何绕过“返回”警告!“;”?
谢谢,
答案 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建议的那样定义一个标记值。