如果一个类有一个未定义的指针作为私有变量,如果观察者函数如下所示,如何检查指针是否有效:
Class Foo
{
private:
Object * object;
public:
Foo();
virtual const Object & get_object() const { return * object; }
}
答案 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;
}
OP,对于其他方法,请同时查看std::optional,或从get_object()
考虑throwing an exception(虽然这不是我的选择)。