gpt4 book ai didi

c++ - 我的函数应该接受指针还是智能指针?

转载 作者:太空狗 更新时间:2023-10-29 19:53:18 24 4
gpt4 key购买 nike

我已经开始使用 std::unique_ptr 例如:

unique_ptr<TFile> myfile( TFile::Open("myfile.root") );

代替

TFile * myoldfile = TFile::Open("myoldfile.root") ;

现在我不确定我的函数应该是什么样子。我认为部分问题可能是我的代码还不够复杂,不足以让任何问题变得明显,但我想现在就得到它,这样我就不会在事情变得更复杂时陷入困惑。

我曾经有过:

double interestingResult( TFile * input )
{...}

(它实际上并没有修改 TFile 但不能是 const,因为它调用了 TFile 的一些非常量函数)。

我仍然可以这样调用它:

myResult  = interestingResult( myfile.get() );

这似乎不是很用户友好。 (我认为这里建议:https://stackoverflow.com/a/5325560/1527126。)

或者我可以修改我的函数,使其看起来像:

double interestingResult( unique_ptr<TFile>& input )
{...}

强制用户始终使用 unique_ptr。

或者我可以通过写作来支持两者:

double interestingResult( unique_ptr<TFile>& input )
{ return interestingResult( intput.get() ); }

但我在其他人的代码中看不到这一点。

这种情况的标准方法是什么?

我认为这个答案 ( https://stackoverflow.com/a/9700189/1527126 ) 暗示我应该接受引用,因为我不希望 myfile 为空。但是库函数 TFile::Open 总是返回一个指针,因此能够将其直接传递到函数中而无需额外的取消引用似乎很自然。

抱歉我放弃了是否应该在 StackOverflow 或 CodeReview 上询问的尝试,但如果不是这样,请指出适当的位置。

最佳答案

您所指的答案是正确的。

如果你有一个函数应该适用于任何现有的 TFile实例并且没有理由接受 NULL 指针作为有效参数,并且函数参数不携带所有权,您应该使用 TFile&作为参数类型( TFile const& 可能的话)。传入的对象由调用者的指针(有或没有所有权)持有不应该对该函数产生影响。

您可以选择使用 TFile *争论,但这至少会导致传递 NULL 的有效性产生歧义,因此可能会在未来引起问题。

如果您使用 unique_ptr<TFile>参数,您将对象的所有权永久传递给函数。调用者将留下 NULL unique_ptr。当电话返回时。

如果您使用 unique_ptr<TFile>&参数,这表明该函数可以选择接管对象的所有权或将其留给调用者。相当不寻常。

A unique_ptr<TFile> const&参数可以像 TFile * 一样使用, 但强制调用者拥有该对象并使用 unique_ptr 管理它.为什么要对调用者施加这样的要求呢?当然,这(以及 unique_ptr 的其他用途)都必须处理 NULL 情况。

关于c++ - 我的函数应该接受指针还是智能指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15391131/

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