返回对未定义指针的引用
Returning a reference to a undefined pointer
如果一个类有一个未定义的指针作为私有变量,如果观察者函数如下所示,如何检查指针是否有效:
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()
中抛出异常(尽管这不是我的选择(。
相关文章:
- C++取消引用指针.为什么会发生变化
- 深层复制具有自引用指针的类
- Visual c ++,使用字符串引用/指针调用 dll 函数
- std::unordered_map::提取引用/指针失效
- 为什么在引用指针时将 const 放在 & 符号的左侧有效,而在右侧则无效?
- 区分接受常量参数的函数引用/指针和与函数参数同名的非常量参数
- 如何在 c++ 中使用带有数学运算的引用/指针?
- 了解通过引用传递取消引用指针时C++堆/堆栈分配
- 取消引用指针并立即为其分配变量,导致分段错误
- 如何获取指向类(而不是对象)的引用/指针
- 将类型参数传递给自引用指针
- 我应该如何定义返回指针的函数?(引用指针与指针指针)
- 在析构函数内取消引用指针时出现分段错误
- 来自引用指针的内存泄漏
- 引用指针后面的值
- 无法取消引用指针
- 引用指针调用成员函数
- 未定义的引用指针的变量模板在clang中功能,而不是GCC
- 取消引用指针以创建数组的副本
- 有关启动引用指针的引用的问题