从另一个函数设置类变量的值

时间:2018-01-01 18:50:42

标签: c++ class oop

我正在研究一个简单的街机风格太空射击游戏,我的CREATE TABLE Animal ( AnimalId INT NOT NULL AUTO_INCREMENT PRIMARY KEY, -- Common Animal fields here ); CREATE TABLE Shark ( AnimalId INT NOT NULL PRIMARY KEY, -- Subclass specific columns NumberFins INT, FOREIGN KEY(AnimalId) REFERENCES Animal(AnimalId) ); CREATE TABLE Ewok ( AnimalId INT NOT NULL PRIMARY KEY, -- Subclass specific columns Fleas BOOL, FOREIGN KEY(AnimalId) REFERENCES Animal(AnimalId) ); 课程出现了一些问题。

这是代码:

player

当然,所有内容都从代码底部的#include<iostream> class player { public: int xPos, yPos; void setPlayerPos(int x, int y); int getX(); int getY(); }; void player::setPlayerPos(int x, int y) { xPos = x; yPos = y; return; } int player::getX() { return xPos; } int player::getY() { return yPos; } void onGameStart() { player Player; Player.setPlayerPos(3,10); } void main() { onGameStart(); while (gameIsRunning) { onGameDraw(); } } 开始。它运行一个简单的main()函数,用于设置玩家的起始坐标。

这是事情。在初始化这些变量时设置onGameStart()xPos的值时,yPosPlayer.getX()将始终返回正确的值。但是,使用Player.getY()设置时,Player.setPlayerPos(x,y)Player.getX()会返回垃圾邮件。 (或者原始初始化值,如果设置的话)。

我想知道我做错了什么,为什么Player.getY()没有更新Player.setPlayerPos(x,y)xPos

4 个答案:

答案 0 :(得分:1)

您的代码似乎不完整...

这段代码似乎无法使用:

void onGameStart() {
    player Player;
    Player.setPlayerPos(3,10);
}

因为你正在改变局部变量 - 那些玩家在功能范围之外被销毁。您在代码中使用的播放器可能是其他实例 - 因此它的x和y不是函数中设置的,而是一些垃圾x和y值 - 因为您没有在构造函数中初始化它们。

如果你声明那些玩家玩家全球(这不是一个好习惯)那么你的代码应该工作(但全局变量总是坏主意)。也许尝试通过指针或引用将这些播放器传递给onGameStart函数

答案 1 :(得分:1)

尝试使用main中的变量:

onGameStart

答案 2 :(得分:1)

在函数POST中,您正在创建一个局部变量播放器并设置其位置,但在函数结束后您无法再访问它,因此它是无用的。也许你想拥有一个全局变量玩家并在游戏开始时设定其位置?我怀疑你混淆了局部变量和另一个你没有从这个函数修改的变量,你没有得到你想要的结果。

答案 3 :(得分:1)

以下对象:player Player; 本地指向您的独立void onGameStart()功能。一旦该函数超出范围,对象就会被破坏。您的其他对象的数据成员保持未初始化,因此垃圾值。您的本地对象与程序中的其他(主?)对象无关:

int main() {
    player p;
    onGameStart(); // only modifies its internal object, not the p
    std::cout << p.getX(); // prints garbage because xPos is uninitialized
    std::cout << p.getY(); // prints garbage because yPos is uninitialized
}

如果您希望onGameStart()函数能够修改对象,则一种方法是通过引用传递对象:

void onGameStart(player& p) {
    p.setPlayerPos(3, 10);
}

现在这段代码打印3和10:

int main() {
    player p;
    onGameStart(p); // now modifies the p
    std::cout << p.getX(); // prints 3
    std::cout << p.getY(); // prints 10
}

也许这就是混乱。在构造函数中初始化数据成员:

class player {
public:
    int xPos, yPos;
    player() : xPos(0), yPos(0) {}
};