获得有关this question的帮助后,我被引导进行更好的调试。在那个过程中,我发现我的问题是这样的:
在C++中工作时,尝试将类的成员变量设置为一个值有效,但在循环时无效。我将代码(遵循)简化为我认为最简单的代码,但仍然会产生错误。
调用Mover类的函数来修改变量pMovXPOS,然后可以在同一作用域内(在该函数内)从调用它的位置(在循环内)将其作为更新进行检索。但是,在循环时,似乎变量已重置为其原始值。
我在这里发布了整个测试代码。问题出在Main-test.cpp文件的RunWorld()函数中。如果编译并运行,您应该看到显示变量已更改然后被重置的输出。
这是范围问题吗?施工/破坏问题?指针/引用问题?我不确定从哪里开始(除了更好的调试之外)。
(由于我是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);
您正在创建索引为
Mover
的iMoverLoop
的副本,然后修改该副本。 vector 中的对象永远不会被修改,并且在下一次迭代中,您的更改将丢失,因为TempMover
被AllMovers
的下一个副本覆盖解决此问题的一种方法是改为使用
TempMover
的引用。例如:Mover& tempMover = AllMovers.at(iMoverLoop);
tempMover.DoMove();
关于c++ - C++类成员变量是否在循环后复位?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9393547/