如何在 C++ 中与另一个 class 共享变量

How do I share variables with another class in c++

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

换句话说:

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

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

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

void move(Player&);

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

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

请注意 struct 声明后的 ;,这是必需的。

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

struct Player {
    void movePlayer();
};

struct Controller {
    static Player p;
};

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

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

由于您可能经常访问控制器,因此您可以传入指向 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->...

    }

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

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

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


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

struct Player {
    // ...

private:
    int* Location;
};