我有一个函数的返回类型为std::string&
,如果函数中没有条件匹配,如何返回NULL string&
?
std::string& SomeClass::getSomething()
{
if(){...}
else if(){...}
// return a NULL
}
答案 0 :(得分:8)
C ++引用不能为空。
如果要返回对生命周期与函数调用范围无关的对象的引用(如数据成员),则可以安全地返回原始指针(我建议使用指向const的指针)。
std::string const* foo::bar() const {
if (condition) {
return &some_data_member;
} else {
return nullptr;
}
}
如果没有,最好的解决方案是使用类似boost::optional
的包装器类型(或C ++ 17中的std::optional
)。这不仅允许您按值返回可选对象(可能更高效),但也是self-documenting。
std::optional<std::string> foo::bar() const {
if (condition) {
return "hello, world";
} else {
return std::nullopt;
}
}
或者,您可以返回一个指针,该指针可以为null。但是,返回原始指针会引发谁负责删除动态分配的字符串的问题。在这种情况下,返回std::unique_ptr
将是最佳选择,因为所有权明确传递给调用者。
std::unique_ptr<std::string> foo::bar() const {
if (condition) {
return std::make_unique<std::string>("hello, world");
} else {
return nullptr;
}
}
甚至更简单,你可以返回一个空字符串,如果在你的情况下这是可能的。老实说,这是我的首选方法(KISS)。
std::string foo::bar() const {
if (condition) {
return "hello, world";
} else {
return "";
}
}
答案 1 :(得分:1)
无论如何,你不会返回NULL
但nullptr
。
此外,您应该小心返回函数的引用,并确保引用引用有效的生命对象。返回对本地对象的引用是错误的。
您无法返回nullptr
,因为nullptr
是指针而string&
是参考 - 不同类型。
您的选择是:
boost::optional
等)的内容。就个人而言,如果我知道函数很可能会失败,我会将结果传递给引用类型参数并返回bool
以表示失败成功
bool SomeClass::getSomething(std::string& result)
{
if(){result = "success 1"; return true; }
else if(){result = "success 2"; return true; }
return false.
}
答案 2 :(得分:0)
正如 juanchopanza 的评论所述,你不能。
如果您需要测试NULL
,您可以使用智能指针重新思考您的方法。例如std::shared_ptr<std::string>
:
std::shared_ptr<std::string> SomeClass::getSomething()
{
std::shared_ptr<std::string> stringPtr;
if(){
//...
stringPtr = std::make_shared<std::string>("Whatever string goes here");
}
else if(){
//...
stringPtr = std::make_shared<std::string>("The other string...");
}
return stringPtr;
}
然后你可以测试std::shared_ptr
并将其隐式转换为bool:
auto strReturnedPtr = someClassObj.getSomething();
if (strReturnedPtr)
{
// Do stuff
}
答案 3 :(得分:0)
返回空字符串&#39;&#39;可能在这里有意义。
从你的代码片段中我想知道你是否在课堂上偷看,以便做出课程本身应该做出的决定。请参阅Martin Fowler关于&#34; Tell, don't Ask&#34;的文章。这也是指实用程序员的原创文章。