代码之家  ›  专栏  ›  技术社区  ›  user9441223

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

  •  1
  • user9441223  · 技术社区  · 6 年前

    我不知道如何使“a”与“b”成为同一个对象。

    游戏状态。h:

    class GameState {
    public: 
      void init(A& b);
    
    protected:
      static A a;
    }
    

    游戏状态。cpp:

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

    我可以使用这样的指针:

    游戏状态。h:

    class GameState {
    public: 
      void init(A* b);
    
    protected:
      static A* a;
    }
    

    游戏状态。cpp:

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

    但我希望a是同一个对象,而不是指向该对象的指针,这样当我想访问“a”时就不必取消对它的引用。

    1 回复  |  直到 6 年前
        1
  •  3
  •   Ulrich Eckhardt    6 年前

    简而言之:你不能。原因很简单 GameState::a 以及通过引用传递给 GameState::init 是不同的对象,它们永远不会是相同的。

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

    首先,想想 GameState::init() 方法它是对类实例的调用 GameState ,它只写入 static 类属性。为什么不写入实例的属性?这闻起来有点像 游戏状态::a 实际上是一个全局变量,继承了它的所有缺点。

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

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

    请注意,您必须确保 A 实例比 配子状态 例子在某些情况下,您必须动态分配事物,并且不再需要它们在外部,通过智能指针传递所有权( std::unique_ptr )如果需要,则可以使用这样的智能指针替换引用。