gpt4 book ai didi

c++ - 函数返回类型 : Pointer, 引用还是其他?

转载 作者:搜寻专家 更新时间:2023-10-30 23:55:04 24 4
gpt4 key购买 nike

让我们假设我总是需要函数的直接返回类型是错误代码(计算成功或失败),然后我将返回一些参数作为参数。将它们定义为引用(并在空之前创建它们)更好还是返回指针更好?

编辑:我应该更准确:错误代码是强制性的,因为我必须遵守给定的编码指南。

可能性A:

ErrorCode func( some_parameters ... , ReturnType & result)
...
ReturnType result; // empty constructor, probably not good practice
func( some_parameters ..., result)

可能性B:

ErrorCode func( some_parameters ... , ReturnType * result){
...
result = new ReturnType(...)
...
}
...
ReturnType * result; // void pointer
func( some_parameters ..., result)
...
delete result; // this is needed if I do not use a smart pointer

更好的是:也许您有更合适的解决方案?

编辑:请说明您使用的是哪个标准,因为不幸的是(指南)我必须坚持使用 C++98。

最佳答案

我会做以下(并且通常会做)

1.) 抛出异常而不是返回错误码

如果这不可能(出于任何原因)

2.) 直接返回指针(raw 或 std::unique_ptr)并在失败时返回 nullptr

如果返回类型必须是 bool 或者不是所有返回的对象都是(指针/堆分配)

3.) 返回你的错误代码( bool 或枚举类)并接受所有要初始化的对象的引用参数(可以这么说必须有对象)和指向可以选择创建/初始化的对象的指针

如果无法在调用之前创建对象(例如,因为它不是默认可构造的)

4.) 传递对指针(raw 或 std::unique_ptr)的引用或指向指针的指针,然后由函数填充

如果您只有 true/false 返回码,std::optional(或类似的)可能是一个选项。

我不喜欢返回 std::pair 或 std::tuple,因为如果您必须开始使用 .first/.second 或 std::get<>() 来访问您的代码,这会使您的代码看起来很烦人不同的返回类型。使用 std::tie() 可以稍微减少这种情况,但(目前)使用起来不是很舒服,并且会阻止使用 const。

例子:

std::unique_ptr<MyClass> func1() { /* ... */ throw MyException("..."); }

std::unique_ptr<MyClass> func2() { /* ... */ }

ErrorCode func3(MyClass& obj, std::string* info = nullptr) { /* ... */ }

ErrorCode func4(std::unique_ptr<MyClass>& obj) { /* ... */ }

int main()
{
try
{
auto myObj1 = func1();
// use ...
}
catch(const MyException& e)
{
// handle error ...
}

if(auto myObj2 = func2())
{
// use ...
}

MyClass myObj3;
std::string info;
ErrorCode error = func3(myObj3, &info);
if(error == ErrorCode::NoError)
{
// use ...
}

std::unique_ptr<MyClass> myObj4;
ErrorCode error = func4(myObj4);
if(error == ErrorCode::NoError)
{
// use ...
}
}

编辑:一般来说,保持 API 的一致性是可取的,所以如果你已经有一个中型或大型代码库,它使用了一种或另一种策略,你应该坚持使用它(如果你没有充分的理由不要)。

关于c++ - 函数返回类型 : Pointer, 引用还是其他?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33825620/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com