我不知道如何使“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”时就不必取消引用它。

最佳答案

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

现在,让我们讨论以“惯用的C++”方式解决此问题的方法:

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

另一种方法是,将依赖项(例如init()的参数)传递到构造函数中(也称为“依赖项注入(inject)”)。然后,您可以使用注入(inject)的依赖项初始化对该参数的引用:

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

    private:
    A& m_a;
};

请注意,您必须确保A实例的寿命超过GameState实例的寿命。在某些情况下,当您必须动态分配事物并且不再需要外部事物时,最好通过智能指针(std::unique_ptr)传递所有权,然后可以用这种智能指针替换引用。

关于c++ - 通过引用传递对象并将其存储为成员变量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49097505/

10-09 05:10