通过引用传递对象并将其存储为成员变量

时间:2018-03-04 16:20:13

标签: c++ class pass-by-reference

我无法弄清楚如何使“a”成为与“b”相同的对象。

Gamestate.h:

class GameState {
public: 
  void init(A& b);

protected:
  static A a;
}

Gamestate.cpp:

A GameState::a;

void GameState::init(A& b)
    {
        ???
    }

我可以使用这样的指针:

Gamestate.h:

class GameState {
public: 
  void init(A* b);

protected:
  static A* a;
}

Gamestate.cpp:

A* GameState::a;

void GameState::init(A* b)
        {
            a = b;
        }

但是我希望a成为同一个对象而不是指向该对象的指针,以便在我想访问“a”时不必取消引用它。

1 个答案:

答案 0 :(得分:3)

简短回答:你不能。简单的原因是GameState::a和通过引用传递给GameState::init的对象是不同的对象,它们永远不会是相同的。

现在,让我们谈谈如何在一个惯用的C ++"中解决这个问题。方式:

首先,考虑GameState::init()的含义。它是对类GameState的实例的调用,它只写入static类属性。为什么不写入实例的属性?这有点闻起来好像GameState::a实际上是一个全局变量,它继承了它的所有不良。

作为一种不同的方法,将依赖关系(如参数init())传递给构造函数(a.k.a。" Dependency Injection")。然后,您可以使用注入的依赖项初始化对该参数的引用:

class GameState {
    public:
    GameState(A& a): m_a(a) {}

    private:
    A& m_a;
};

请注意,您必须确保A实例超过GameState实例。在某些情况下,您必须动态分配内容以及不再需要它们的地方,通过智能指针(std::unique_ptr)传递所有权是可取的,然后您可以用这样的方式替换引用智能指针。