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

问题描述 投票:1回答:1

我无法弄清楚如何使“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”时我就不必取消引用它。

c++ class pass-by-reference
1个回答
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)传递所有权是可取的,然后您可以用这样的智能指针替换引用。

© www.soinside.com 2019 - 2024. All rights reserved.