返回对未定义指针的引用

时间:2018-06-05 04:49:25

标签: c++ pointers reference

如果一个类有一个未定义的指针作为私有变量,如果观察者函数如下所示,如何检查指针是否有效:

Class Foo
{
  private:
    Object * object;
  public:
    Foo();
    virtual const Object & get_object() const { return * object; }
}

2 个答案:

答案 0 :(得分:2)

在构造函数中(在初始化列表中),您可以将Object *object设置为nullptr

Foo::Foo()
:
object(nullptr)
{}

并在get_object()方法中进行if检查以确保object在取消引用之前不为空:

if(object)
  return *object;
else
  // create and return a new Object depending on your use-case.

答案 1 :(得分:1)

我认为我们在这里误解了OP的问题,包括我在内。好吧,他没有初始化object,但是,如果我读得对,那不是他所要求的。我想,他想知道一个参考文献如何指向'一个无效的对象。

嗯,通常它不能。合同在返回引用时,它始终指向有效的内容,而具体不会在内容中包含nullptr。那是为什么你返回一个引用,而不是一个指针。因为它带有这种保证。

那么,@拉尔夫把自己画成了一个角落吗?嗯,不太好。通常的解决方案当然是让get_object()首先返回一个指针,但他显然不想这样做。

这里一个好的解决方案是保持类型为Object的对象作为无效对象的占位符。那很简单。我会停止胡扯并发布一些代码:

#include <iostream>

class Object
{
    // ...

public:
    static Object invalid_object;
    bool is_valid () const { return this != &invalid_object; };
};

Object Object::invalid_object;

class Foo
{
private:
    Object * object = nullptr;
public:
    Foo() { }
    virtual const Object & get_object() const { return (object) ? *object : Object::invalid_object; }
};

现在你可以这样做:

int main ()
{
    Foo foo_obj;
    const Object& obj = foo_obj.get_object ();
    if (obj.is_valid ())
        std::cout << "object is valid" << std::endl;
    else
        std::cout << "object is invalid" << std::endl;
    return 0;
}

Live demo

OP,对于其他方法,请同时查看std::optional,或从get_object()考虑throwing an exception(虽然这不是我的选择)。