gpt4 book ai didi

C++ 类成员变量在循环后重置?

转载 作者:行者123 更新时间:2023-11-28 00:59:44 25 4
gpt4 key购买 nike

this question 上获得帮助后,我被引导去做更好的调试。在那个过程中,我发现我的问题是这样的:

在 C++ 中工作时,尝试将类的成员变量设置为一个值是可行的,但在循环时不行。我已将我的代码(遵循)减少到我认为最简单的代码,因为它仍然会产生错误。

调用修改变量 pMovXPOS 的类 Mover 的函数,然后可以在相同范围内(在该函数内)和从它被调用的地方(在循环内)检索更新后的变量。然而,在循环时,变量似乎被重置为其原始值。

我在这里发布了完整的测试代码。问题在于 Main-test.cpp 文件的 RunWorld() 函数。如果您编译并运行,您应该会看到显示变量变化的输出,然后被重置。

这是范围问题吗? build /破坏问题?指针/引用问题?我不确定从哪里开始(除了更好的调试之外)。

(由于我是 C++ 的新手,我确信我使用的风格和/或方法存在一些明显的问题。如果有任何主要的禁忌,请随时指出。)

在此先感谢您的帮助!

//Main-Test.cpp
#include "Globals-Test.h"
#include "Mover-Test.h"

std::vector < Mover > AllMovers;

long SysCounter;

Mover CreateNewMover() {
Mover TempMover;

TempMover.setXPOS(5);
TempMover.setYPOS(10);

return TempMover;

}

void RunWorld() {
Mover TempMover;
unsigned int iMoverLoop;

srand ( time(NULL) );

AllMovers.push_back(CreateNewMover());

for (SysCounter = 0; SysCounter <= 50; SysCounter++) {
for (iMoverLoop = 0; iMoverLoop < AllMovers.size(); iMoverLoop++) {
std::cout << "Loop #:" << SysCounter << std::endl;
TempMover = AllMovers.at(iMoverLoop);
std::cout << "Is: " << TempMover.getXPOS() << std::endl;
TempMover.DoMove();
std::cout << "Is: " << TempMover.getXPOS() << std::endl;
}
}
}



int main() {
RunWorld();
return 0;
}

//Globals-Test.h
#include <stdlib.h>
#include <stdio.h>
#include <iostream>
#include <sstream>
#include <unistd.h>
#include <ctype.h>
#include <math.h>
#include <string>
#include <vector>
#include <time.h>
#include <fstream>

//Mover-Test.h
extern long MoverIndex;

class Mover {

private:

int pMovXPOS;
int pMovYPOS;

public:

int getXPOS();
void setXPOS(int newXPOS);
int getYPOS();
void setYPOS(int newYPOS);

Mover();
~Mover();

void DoMove();

};

//Mover-Test.cpp
#include "Globals-Test.h"
#include "Mover-Test.h"

Mover::Mover() {

}

Mover::~Mover() {

}

int Mover::getXPOS() {
return pMovXPOS;
}

void Mover::setXPOS(int newXPOS) {
pMovXPOS = newXPOS;
}

int Mover::getYPOS() {
return pMovYPOS;
}

void Mover::setYPOS(int newYPOS) {
pMovYPOS = newYPOS;
}

void Mover::DoMove() {
pMovXPOS = pMovXPOS + 1;
pMovYPOS = pMovYPOS + 1;

//Compiled with:
g++ -Wall -lm -c Main-Test.cpp
g++ -Wall -lm -c Mover-Test.cpp
g++ -Wall Mover-Test.o Main-Test.o -o world-test.exe -lm

最佳答案

你的问题是这一行:

TempMover = AllMovers.at(iMoverLoop);

您正在创建索引 iMoverLoop 处的 Mover 拷贝,然后修改该拷贝。 vector 中的对象永远不会被修改,并且在下一次迭代中您的更改将丢失,因为 TempMoverAllMovers

的下一个拷贝覆盖

解决此问题的一种方法是使用 TempMover 的引用。例如:

Mover& tempMover = AllMovers.at(iMoverLoop);
tempMover.DoMove();

关于C++ 类成员变量在循环后重置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9393547/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com