我有一个函数有两个类的实例作为参数:
void cookPasta(const Tomato& tomato, const Meat* meat)
{
if (meat != nullptr)
cookPastaWithMeat(tomato, *meat);
else
cookPastaWithoutMeat(tomato);
}
如函数所示,始终需要Tomato
的实例,而Meat
是可选的,而nullptr
则可以传递。cookPasta
。我这样做是为了允许调用Meat
函数,即使用户从未声明过 self.collectionView.performBatchUpdates({
let selectedItems = self.collectionView.indexPathsForSelectedItems()!
self.picturesObject.deleteItemsAtIndexPaths(selectedItems)
self.collectionView.deleteItemsAtIndexPaths(selectedItems)
}, completion: {_ in})
类的实例。
在函数签名中混合引用和指针是不好的做法吗?
答案 0 :(得分:30)
使用这种方法你失去的一件事是可以传递一个临时的Meat
,因为它的地址不能被采用。
为什么不使用重载,只需重命名cookPastaWithMeat
和cookPastaWithoutMeat
?
void cookPasta(const Tomato& tomato, const Meat& meat);
void cookPasta(const Tomato& tomato);
答案 1 :(得分:8)
你的实践很好
const
关键字。但是,使用C ++的pointer
,第二个参数optional parameter feature
会更好一些。 check out here
void cookPasta(const Tomato& tomato, Meat* meat = nullptr)
{
if (meat != nullptr)
cookPastaWithMeat(tomato, *meat);
else
cookPastaWithoutMeat(tomato);
}
现在,同时调用相同的功能。
cookPasta(tomato); // meat will default to nullptr
cookPasta(tomato, meat);
答案 2 :(得分:3)
这是一个很好的做法,因为你有充分的理由这样做:指针可以为nullptr
,而必须始终传递引用。你正在优雅地利用它。
使用const
表示该函数无法修改从调用者传递的参数;这也很好。