隐藏指针与引用

时间:2013-04-18 17:01:54

标签: c++ pointers reference

隐藏使用引用的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,我认为这是调用者对象的责任。

4 个答案:

答案 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)

这是一个惯例问题,但我更喜欢包含这个问题:

  • 如果被调用方法保留传递对象的指针,请使用指针参数并在API文档中明确说明生命周期要求
  • 如果被调用的方法只是在方法执行期间偷看(并且可能是戳)传递的对象,请使用引用。
  • 接受引用说:我只接受有效的对象。
  • 接受指针说:除非另有明确说明,否则我也接受空指针。
顺便说一下,我不喜欢到处都是分享指针。终身失控,所有权变得模糊不清。当然,共享指针仍有非常有效的用途,但从不使用它们只是因为你不想考虑生命周期和所有权。