【发布时间】:2013-06-19 04:49:35
【问题描述】:
I have a class :
class A
{
private:
vector<int> x;
public:
const vector<int>& immutable_data() {
return x;
}
vector<int>* mutable_data() {
return &x;
}
}
现在如果我使用这个类,在我的代码中,我是否必须检查 mutable_data() 返回的指针是否为空(假设我知道这个类的结构)。就我个人而言,我认为我不必这样做,因为我知道存在一个返回 const 引用的辅助 api,所以我的指针永远不会为 null(我无法想象这个函数会返回 null 的场景,即使它不知何故返回null,在这种情况下const ref版本的行为是什么)。或者我应该说我知道它是堆栈上现有对象的地址,所以它不能为空?这是思考或推理的正确方法吗?如果有人认为另一种方式,请给出一些示例代码。
对于生产代码中更常见的情况:如果我使用协议缓冲区,我已经知道为我的消息模板生成的代码(例如:类似于 stl 容器的重复字段),但我仍然需要进行 null 检查每次我想使用可变 api 时,因为它们总是通过指针或 const 引用返回。
通过引用返回不是我想要的。
【问题讨论】:
-
它是你的代码,所以它是你的选择!请记住,如果方法是虚拟的,那么所有子类都需要遵守约定,否则您会遇到问题。
-
const vector<int> &data() const和vector<int> &data()有问题吗? -
记住:如果你是
A的对象是完全构造的,那么A::x也是完全构造的。x不能变成NULL,因为它没有存储在其他地方,并且使用指针间接访问(而不是引用,因为引用不能变成NULL)。 -
一般来说,你需要确保指针不为空,然后再间接它们。一旦知道它不为空,就可以保留对它指向的对象的引用,以明确不需要进行更多检查。
-
@chris :我想更多地关注检查空指针的情况是多余的。
标签: c++ pointers reference protocol-buffers