c++函数返回NULL字符串引用
c++ function return NULL string reference
我有一个返回类型为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&
是引用——不同的类型。
您的选择是:
- 引发异常
- 使用可选类(
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;
}
- Visual c ++,使用字符串引用/指针调用 dll 函数
- 字符串引用参数的效率C++
- C++字符串引用不能共存
- 尝试使用字符串引用已删除的函数
- 设置可变值通过字符串引用它
- std::串联的字符串引用是安全的
- 字符串引用(函数)的差异
- 字符串引用和常量字符指针的函数重载
- 将浮点数分配给字符串引用有效 - 为什么
- 常量字符串引用作为非类型模板参数
- 函数,该函数返回一个字符串引用c++
- 如何实例化C++成员字符串引用
- c++函数返回NULL字符串引用
- 在 C++ 中返回 const 字符串引用的字符串文本
- CPP 中的字符串引用处理
- 为什么我的字符串引用成员变量在C++中设置为空字符串
- 了解返回字符串引用的函数中的"const"
- c++在同一个函数中返回字符串引用和传递字符串引用
- System::对C++char*参数的字符串引用
- 正在更改conststd::字符串引用的referent