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

c++ function return NULL string reference

本文关键字:字符串 引用 NULL 返回 函数 c++      更新时间:2023-10-16

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

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

C++引用不能为null。

如果返回的对象的生存期与函数调用的范围无关,比如数据成员,则可以安全地返回原始指针(我建议使用指向const的指针)。

std::string const* foo::bar() const {
    if (condition) {
        return &some_data_member;
    } else {
        return nullptr;
    }
}

如果没有,最好的解决方案是使用像boost::optional(或C++17中的std::optional)这样的包装器类型。这不仅允许您按值返回可选对象(这可能更具性能),而且是自文档化的。

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 "";
    }
}

无论如何,您不会返回NULL,而是返回nullptr。此外,您应该小心从函数返回引用,并确保引用引用了一个有效的活动对象。返回对本地对象的引用是错误的。

不能返回nullptr,因为nullptr是指针,string&是引用——不同的类型。

您的选择是:

  1. 引发异常
  2. 使用可选类(boost::optional等)

就我个人而言,如果我知道函数很有可能失败,我会将结果传递给引用类型的参数,并返回bool以指示失败的成功

bool SomeClass::getSomething(std::string& result)
{
     if(){result = "success 1"; return true; }
     else if(){result = "success 2"; return true; }
     return false.
}

在这里返回空字符串"可能是有意义的。

从你的代码片段中,我想知道你是否在窥探类的盖子,以做出类本身应该做出的决定。请参阅Martin Fowler关于"告诉,不要问"的文章,这篇文章也引用了《实用程序员》关于这一点的原始文章。

正如juancopanza在评论中所说,你不能。

如果您需要测试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
}

我也面临同样的问题。我所做的是让调用者传递要返回的内容,以防返回必须为空:

string myFunc(string param1, string not_found_value) {
if (not_returning_null)
    return actual_string;
else
    return not_found_value;
}