隐藏使用引用的setter的指针成员是一件好事吗?
class Foo
{
Bar* m_ptr;
public :
void setBar(Bar& bar){m_ptr = &bar;}
};
或者最好在setter中公开引用对象的真实类型(以及为什么)?
void setBar(Bar* bar){m_ptr = bar;}
事实上,我正在使用不是“引用友好”的stl竞争者,因此我将指针的向量作为类成员但我更喜欢处理引用的方法。这样做是件坏事吗?
编辑:
存储的成员是指针,这个例子更适合我的问题:
class Foo
{
std::vector<FooObserver *> m_observers;
public :
你更喜欢这个:
void addObserver(FooObserver* obs);
或者这个:
void addObserver(FooObserver& obs);
在这两种情况下,指针永远不应该为NULL,我认为这是调用者对象的责任。
答案 0 :(得分:5)
对我而言,它归结为该类型的语义。如果指针屏蔽了一个从不打算成为NULL
的成员,那么绝对在输入和输出位置都使用引用。如果该值可以合法地为NULL
,那么使用指针是最好的方法
答案 1 :(得分:3)
这取决于你想要达到的目标,两者都是完全合理的。
唯一的区别*是void setBar(Bar* bar)
接受空指针,而void setBar(Bar& bar)
显然不会。
您可以根据是否要允许空指针来选择要使用的那个。
(*)假设Bar
的作者未提供自定义operator&
(无论如何这都是一个糟糕的主意)。
编辑:由于您不希望存储空指针,因此最好使用引用。你说“指针永远不应该是NULL并且我认为这是调用者对象的责任”,但是有了引用,你有机会在编译时强制执行它,并且完全依赖调用者的善意,这是更好的设计。
答案 2 :(得分:2)
是。因为它弄乱了你对两个物体的一生控制,请考虑这个
void AdjustFoo(Foo& f)
{
Bar B;
f.setBar(B);
//Crap f now contains a bad pointer to B after this function exists
}
如果foo需要拥有一个B,它应该拥有一个shared_ptr或一个B的副本。
答案 3 :(得分:1)
这是一个惯例问题,但我更喜欢包含这个问题: