我开始使用 std::unique_ptr
,例如:
unique_ptr<TFile> myfile( TFile::Open("myfile.root") );
替代
TFile * myoldfile = TFile::Open("myoldfile.root") ;
现在我不确定我的函数应该长成什么样子。我认为问题的一部分可能是我的代码还不够复杂,所以尚未出现任何问题,但我希望现在就做对,以免在事情变得更加复杂时陷入困境。
我的旧代码:
double interestingResult( TFile * input )
{...}
这段代码并没有实际修改TFile,但不能使用const关键字,因为它调用了一些非const的TFile函数。
我仍然可以通过以下方式调用:
myResult = interestingResult( myfile.get() );
这似乎不是很用户友好。(我认为建议在这里:https://dev59.com/nlXTa4cB1Zd3GeqP0EUK#5325560。)
或者我可以修改我的函数看起来像:
double interestingResult( unique_ptr<TFile>& input )
{...}
强制用户始终使用unique_ptr。
或者我可以通过编写以下代码来同时支持两种方式:
double interestingResult( unique_ptr<TFile>& input )
{ return interestingResult( intput.get() ); }
但我在别人的代码中没有看到这种做法。
在这种情况下,标准的方法是什么?
我认为这个答案 (https://dev59.com/zWkw5IYBdhLWcg3ws833#9700189) 意味着我应该接受引用,因为我不希望 myfile
是空值。但库函数 TFile::Open
总是返回指针,所以直接将其传递到函数中而不需要额外的解引用似乎是很自然的做法。
道歉的附言:我放弃了尝试弄清楚是否应该在StackOverflow或CodeReview上询问或者干脆不问,但如果这不是适当的地方,请指出适当的地方。
strcpy
,但当我有选择时,我会使用字符串类而不是裸 C 字符串。 - JoergBnull
是否是有效输入的人(即在非常糟糕的一天里几乎任何人)也不费心在解除引用指针之前检查 null。所以他们只是将*p
传递给您的函数,该函数采用引用,并且有时p
在他们的代码中为 null,需要有人发现并修复它。 - Steve Jessop