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

时间:2015-01-29 23:54:13

标签: c++ oop scope class-design

我有两个类,播放器和控制器。 Controller具有主游戏循环,并包含播放器。它还存储世界地图。 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?
    }
}

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

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

    }

答案 2 :(得分:0)

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

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

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


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

struct Player {
    // ...

private:
    int* Location;
};