重载函数以获取指针或引用是不好的做法吗?

Mat*_*att 19 c++ pointers overloading reference

例如,如果我有一个结构FooSpec:

struct FooSpec { /* lots of data */ };
Run Code Online (Sandbox Code Playgroud)

将以下两个都作为重载函数提供是不好的做法吗?或者我应该选择一个并坚持下去?

Foo *createFoo(const FooSpec *spec) { /* ... */ }
Foo *createFoo(const FooSpec &spec) { return createFoo(&spec); }
Run Code Online (Sandbox Code Playgroud)

两者都会导致意想不到的问题?

eml*_*lai 21

应该只有一种方法来做某件事.这将使代码更清晰.因此,您应该只选择一个,具体取决于语义:

  • 如果a nullptr是要传递给的有意义的值createFoo,则声明该函数采用指针.

  • 如果nullptr不应该传递给a createFoo,那么将参数声明为引用,使编译器对尝试传入a的人大喊大叫nullptr.

现在你的代码的用户将会"啊,我可以将null传递给该函数,很酷!" 或"好的,这个功能需要一个实际的对象才能正常工作".

在整个项目中坚持这一惯例,使代码的界面更加连贯.

或者像WhozCraig所说的那样,

选择合适的模型并告诉客户"这是您的界面".


Yak*_*ont 5

我可以想到一个不太有用的理由来做这件事。

Foo*版本可以检查空,处理这种情况,如果不使用的参考案例。

Foo&则不能检查空。

这让调用者说“我知道这不是空的,因为我检查过”,在函数中保存一个分支。

然而,一旦该方法的成本超过一个非常低的阈值,这种好处(节省一个分支)就毫无意义了。