c ++函数返回NULL字符串引用

时间:2016-03-28 16:27:20

标签: c++ reference null

我有一个函数的返回类型为std::string&,如果函数中没有条件匹配,如何返回NULL string&

std::string& SomeClass::getSomething()
{
     if(){...}
     else if(){...}
     // return a NULL
}

4 个答案:

答案 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)

无论如何,你不会返回NULLnullptr。 此外,您应该小心返回函数的引用,并确保引用引用有效的生命对象。返回对本地对象的引用是错误的。

您无法返回nullptr,因为nullptr是指针而string&是参考 - 不同类型。

您的选择是:

  1. 抛出异常
  2. 使用类似可选类(boost::optional等)的内容。
  3. 就个人而言,如果我知道函数很可能会失败,我会将结果传递给引用类型参数并返回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;的文章。这也是指实用程序员的原创文章。