返回对未定义指针的引用

Returning a reference to a undefined pointer

本文关键字:引用 指针 未定义 返回      更新时间:2023-10-16

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

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

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

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

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

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

我想我们都误解了OP的问题,包括我。 好吧,他未能初始化object,但是,如果我没看错的话,这不是他要问的。 我相信,他想知道引用如何"指向"无效对象。

好吧,通常不能。 当返回引用时,合同是它将始终指向有效的东西,特别是不会在幕后包含nullptr。 这就是返回引用而不是指针的原因。 因为它承载着这种保证。

那么,@Ralff把自己画进了墙角了吗? 嗯,不完全是。 当然,通常的解决方案是首先让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;
}

现场演示。

OP,对于其他方法,也可以查看 std::optional,或者考虑从get_object()中抛出异常(尽管这不是我的选择(。