如何在 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;
};
我有两个 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;
};