如何在 c++ 中与另一个类共享变量

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

本文关键字:另一个 共享变量 c++      更新时间:2023-10-16

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

换句话说:

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成员,它们对整个类都有效,因此甚至不需要对象:

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;
};