C++ 返回对未定义指针的引用

C++ 返回对未定义指针的引用,c++,pointers,reference,C++,Pointers,Reference,如果一个类有一个未定义的指针作为私有变量,如果观察者函数如下所示,如何检查指针是否有效: Class Foo { private: Object * object; public: Foo(); virtual const Object & get_object() const { return * object; } } 在构造函数中(在初始值设定项列表中),可以将Object*Object设置为nullptr Foo::Foo() : object(

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

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检查以确保
对象在取消引用之前不为空:

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

我想我们都误解了OP的问题,包括我。好的,他没有初始化
对象
,但是,如果我读对了,那不是他要问的。我相信,他想知道引用如何“指向”无效对象

嗯,通常情况下是不行的。当返回引用时,合同将始终指向有效的内容,特别是在封面下不包含
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; }
};
#包括
类对象
{
// ...
公众:
静态对象无效\u对象;
bool是有效的()常量{返回此!=&invalid_object;};
};
对象对象::无效的_对象;
福班
{
私人:
Object*Object=nullptr;
公众:
Foo(){}
虚拟常量对象&get_Object()常量{return(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;
}
int main()
{
福福欧;
const Object&obj=foo_obj.get_Object();
if(obj.is_valid())

std::我能看到你声明了一个构造函数吗……有什么原因不能用它来确保类不变量保持不变吗?你应该在构造时将指针设置为
nullptr
,然后你可以检查它是否为null。显然,当它为null时不要调用
get\u object
(或者让该函数抛出)指针是未初始化的,不是未定义的。这意味着它可以包含任何值whatsover,您将根据什么来测试它?寓意:在构造函数中初始化所有成员变量,或者通过编码
Object*Object=nullptr;
。就是这样做的。我一直在考虑创建一个新的
对象
,然后返回,如果问题中显示了
类对象
会更好。我看到了编辑。这是一个很好的改进。
throw
也应该在表上,这取决于用例。是否可以在不修改观察者的情况下进行检查?我想返回指针的引用是如何工作的,这让我感到困惑。@Ralff:Do您的意思是不将object设置为
nullptr
?再次,您是否对取消引用的工作方式感到困惑?如果您能尝试更清楚一点,那将是非常好的。您是正确的,先生。引用必须是有效的对象,并且NULL被标准明确称为verboten。我显然滥用了非法药物。