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

C++ 从另一个函数设置类变量的值,c++,class,oop,C++,Class,Oop,我正在开发一款简单的街机风格的太空射击游戏,我的播放器类出现了一些问题 代码如下: #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) {

我正在开发一款简单的街机风格的太空射击游戏,我的
播放器
类出现了一些问题

代码如下:

#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();
    }
}
#包括
职业选手{
公众:
int XPO,YPO;
void setPlayerPos(整数x,整数y);
int getX();
int getY();
};
void player::setPlayerPos(整数x,整数y){
xPos=x;
yPos=y;
回来
}
int-player::getX(){
返回XPO;
}
int-player::getY(){
返回YPO;
}
void onGameStart(){
玩家;
Player.setPlayerPos(3,10);
}
void main(){
onGameStart();
同时(游戏运行){
onGameDraw();
}
}
当然,一切都从代码底部的
main()
开始。它运行一个简单的
onGameStart()
函数,该函数用于设置播放器的起始坐标

事情是这样的。当我在初始化这些变量时设置
xPos
yPos
的值时,
Player.getX()
Player.getY()
将始终返回正确的值。但是,当使用
Player.setPlayerPos(x,y)
设置它们时,则
Player.getX()
Player.getY()
返回垃圾。(或原始初始化值,如果设置)


我想知道我做错了什么,以及为什么
Player.setPlayerPos(x,y)
不更新
xPos
yPos
您的代码似乎不完整

此代码似乎不可用:

void onGameStart() {
    player Player;
    Player.setPlayerPos(3,10);
}
因为您正在更改局部变量-这些播放器在函数范围之外被销毁。您在代码中使用的播放器可能是其他实例-因此它的x和y不是在函数中设置的,而是一些垃圾x和y值-因为您没有在构造函数中初始化它们


如果您将这些player声明为globaly(这不是一个好的实践),那么您的代码应该可以工作(但全局变量总是一个坏主意)。也许可以尝试通过指针或引用函数onGameStart传递这些播放器,您的代码似乎不完整

此代码似乎不可用:

void onGameStart() {
    player Player;
    Player.setPlayerPos(3,10);
}
因为您正在更改局部变量-这些播放器在函数范围之外被销毁。您在代码中使用的播放器可能是其他实例-因此它的x和y不是在函数中设置的,而是一些垃圾x和y值-因为您没有在构造函数中初始化它们


如果您将这些player声明为globaly(这不是一个好的实践),那么您的代码应该可以工作(但全局变量总是一个坏主意)。也许可以尝试通过指针或对函数onGameStart的引用来传递这些播放器

尝试在main中使用如下变量:

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

int main() {
    player Player;
    onGameStart(Player);
    while (gameIsRunning) {
        onGameDraw(Player); // Need to know more about the implementation but it should be similiar to onGameStart.
    }
}

尝试在main中使用以下变量:

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

int main() {
    player Player;
    onGameStart(Player);
    while (gameIsRunning) {
        onGameDraw(Player); // Need to know more about the implementation but it should be similiar to onGameStart.
    }
}

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

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

以下对象:
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
}
现在,此代码打印3和10:

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

以下对象:
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
}
现在,此代码打印3和10:

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

您只有一个播放机,这是onGameStart的本地播放机。你到底在哪里观察到这种行为?(我怀疑您还有另一个变量,也被称为“Player”,但事情并不相同,只是因为它们共享一个名称——问问约翰·史密斯。)我做错了什么,为什么Player.setPlayerPos(x,y)不更新xPos和yPos。很难说,因为您没有显示执行此操作的代码。在您的示例中,您正在更新函数
onGameStart
中的局部变量
Player
,您根本没有发布
onGameDraw
,因此我们看不到它的作用,但是如果您正在创建另一个局部变量
Player
(或类似),然后,它将包含来自未初始化的
player
对象的未初始化
{x,y}
,解释随机性。您可能希望将
玩家
从main传递到不同的
onGameXXXX
函数中,或者拥有一个包含一个或多个玩家的
游戏
对象。以下对象:
玩家
void onGameStart()
函数的本地函数。一旦该函数超出作用域,它就会被销毁。可能您认为创建一个名为
Player
的附加变量会以某种方式使您能够访问在本地
Player
中设置的值。然而,C++并不是这样工作的。你只有一个玩家,它是本地的,代码< OnAsESTART> /CODE >。你到底在哪里