在不使用指针的情况下,如何允许未初始化类类型的对象并确定何时是这种情况?

Apo*_*son 1 c++ pointers

最近,我发现使用C ++的过去几年中,我经常使用指针,而且通常在可以轻松地将它们替换为更合适的指针时使用。我使用它们的目的是使用一个对象来允许未初始化的对象,并轻松进行检查。

例如,假设我有一个要附加到游戏中对象上的相机:

Class Camera {
    public:
        Entity *attachEntity;
        Camera() {
            attachEntity = nullptr;
        }

        void update() {
            // If there's an entity to be attached to
            if (attachEntity != nullptr) {
                ...
            }
        }
};
Run Code Online (Sandbox Code Playgroud)

这是指针的不好用法吗?如果不使用它,我找不到一种好的方法。而且,如果不应该将其附加到实体,则可以将其nullptr重新设置为指针。否则,attachEntity无论当前是否安装了相机,都必须始终有一个。这种做法有什么问题吗?有没有指针的好方法吗?我看到您不能仅仅将一个对象设置为可以NULL像指针一样。最好的方法是什么?

Ste*_*dit 5

  1. 如果您需要值语义,但仍然需要能够省略值,则可以使用std :: optional
  2. 您使用std :: unique_ptr会得到类似的行为,除了实体不在时不占用空间,否则会进入其自己的动态分配内存块。
  3. 如果要非所有权引用寿命超过Cameria实例寿命的Entity实例,则适合使用原始指针。
  4. 当实体可能被多个摄像机(或其他事物)使用并且您需要确保其寿命延长到最后一次使用时,这就是std :: shared_ptr所适合的位置。
  5. 正如Michael所指出的,还有std :: weak_ptr,这是一个很好的了解,但在实践中通常很少见。它用于寻址shared_ptr而不保持其活动状态。

(已编辑以添加#5)