隐藏带有引用的指针
Hiding pointers with references
用使用引用的setter隐藏指针成员是一件好事吗?
class Foo
{
Bar* m_ptr;
public :
void setBar(Bar& bar){m_ptr = &bar;}
};
还是最好在setter中公开被引用对象的真实类型(为什么)?
void setBar(Bar* bar){m_ptr = bar;}
事实上,我使用的仍然是不"引用友好"的竞争者,所以我有指针的向量作为类成员,但我更喜欢处理接受引用的方法。这样做是件坏事吗?
编辑:存储成员是指针,这个例子更适合我的问题:
class Foo
{
std::vector<FooObserver *> m_observers;
public :
你喜欢这个吗?
void addObserver(FooObserver* obs);
或者:
void addObserver(FooObserver& obs);
?
在这两种情况下,指针都不应该为NULL,我认为这是调用者对象的责任。
对我来说,这归结为类型的语义。如果指针正在屏蔽一个不打算为NULL
的成员,那么绝对在输入和输出位置都使用引用。如果该值可以合法地为NULL
,那么使用指针是最好的方法
这取决于你想要达到什么效果,两者都是完全合理的。
唯一的区别*是void setBar(Bar* bar)
将接受空指针,而void setBar(Bar& bar)
显然不会。
您可以根据是否允许空指针来选择使用哪一个。
(*)假设Bar
的作者没有提供自定义的operator&
(无论如何,这是一个糟糕的想法)。
Edit:由于您不希望允许存储空指针,因此首选引用。你说"指针永远不应该是NULL,我认为这是调用者对象的责任",但是有了引用,你就有机会在编译时强制执行,并避免完全依赖调用者的善意,这是更好的设计。
是。由于它混淆了对两个对象的生命周期控制,请考虑如下
void AdjustFoo(Foo& f)
{
Bar B;
f.setBar(B);
//Crap f now contains a bad pointer to B after this function exists
}
如果foo需要拥有B,它应该拥有B的shared_ptr或副本
这是惯例问题,但我更喜欢包含以下内容的
- 如果被调用的方法保留了传递对象的指针,使用指针参数,并在API文档中明确说明生命周期要求。
- 如果被调用的方法只是在方法执行期间窥视(可能是戳)到传递的对象,则使用引用。
- 接受引用表示:我只接受有效的对象。
- 接受指针表示:我也接受空指针,除非另有明确说明。
顺便说一句,我不喜欢到处放共享指针。生命失去了控制,所有权变得模糊。当然,共享指针仍然有非常有效的用途,但千万不要仅仅因为不想考虑生命周期和所有权而使用它们。
相关文章:
- 如何使用基类指针引用派生类成员
- 将常量指针引用绑定到非常量指针
- 如果非动态变量被指针引用,何时超出范围?
- 转换指针引用的字符串
- 指针引用的生存期(以 C++为单位)
- 从 unique_ptr::get 发送指针作为指针引用进入函数
- 指针/引用的 CLion 格式
- 使用模板专用化来比较指针引用
- 如何保存指向抽象基类的指针/引用,但在 c++ 中仍然可以复制
- C++初始化指针/引用/复制细微差别
- 用数组或指针引用函数?
- 指针范围问题和返回类中封装的指针向量内的指针引用
- 强制转换为指针引用是否会导致未定义的行为
- 访问由 void 指针引用的结构的成员
- C 为什么当先前的步骤引发异常时,std :: shared_ptr的指针引用会被破坏
- 动态指针引用数组由三元运算符返回值,但有异常
- 悬空指向 int 和 char* 常量的指针/引用
- C++ 二维数组和指针引用
- 通过使用指针/引用,在C++中使用向量加快计算速度
- C++非类型模板模板到函数指针/引用