【问题标题】:How do I share variables with another class in c++如何在 C++ 中与另一个类共享变量
【发布时间】:2015-01-29 23:54:12
【问题描述】:

我有两个类,Player 和 Controller。 Controller 具有主游戏循环,并包含一个 Player。它还存储世界地图。 Controller 类通过调用 Player 类的各种方法(例如 moveForward())将用户输入传递给播放器。我现在正在实现碰撞检测,为此,我需要一种让 Player 类查看世界地图的方法,但这是在 Player 类所在的 Controller 类中。

换句话说:

struct Controller {
    int worldMap[16][16][16];
    Player p;
    ...
}

struct Player {
    movePlayer() {
        #How do I check world map here?
    }
}

【问题讨论】:

  • 我会创建一个 worldMap 类并传递它而不是直接传递数组,因为您将来可能会决定使用不同的数据结构。

标签: c++ oop scope class-design


【解决方案1】:

为简单起见,我们假设您要做的只是调用一个简单的函数(检查其他成员的工作方式相同,但会导致更复杂的示例):

void move(Player&);

如果您手头有对象,您只能访问非static 成员。如果你这样做,它很简单:

struct Player {
    void movePlayer(Controller& controller) {
        move(controller.p);
    }
};

注意struct 声明后面的;,它是必需的。

另一方面,如果您有 static 成员,则它们对整个班级都有效,因此甚至不需要对象:

struct Player {
    void movePlayer();
};

struct Controller {
    static Player p;
};

void Player::movePlayer() {
    move(Controller::p);
}

注意声明出现的顺序:要声明Player类型的变量,您需要先声明struct Player

【讨论】:

    【解决方案2】:

    由于您可以频繁地访问控制器,因此您可以传入一个指向 Player 的指针,然后将它分配给一个成员。

    struct Controller {
        int worldMap[16][16][16];
        Player p;
        ...
    
        Controller() {
            p.setController( this );
        }
    };
    
    struct Player {
        Controller* mController;
        movePlayer() {
    
            mController->...
    
        }
        setController( Controller* controller ) {
            mController = controller;
        }
    };
    

    如果您需要以较低的间隔访问它,您可以将引用传递给函数。

        Player::movePlayer( Controller* controller ) {
    
            mController->...
    
        }
    

    【讨论】:

      【解决方案3】:

      movePlayer()需要的数据作为参考参数传递:

      void movePlayer(const int (&map)[16][16][16]) { ... }
      

      如果movePlayer() 只需要访问worldMap,则传递整个Controller 对象会很糟糕。


      或者,您可以将指向当前地图的指针存储在 Player 对象本身中:

      struct Player {
          // ...
      
      private:
          int* Location;
      };
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-16
        • 2022-11-14
        • 1970-01-01
        相关资源
        最近更新 更多