Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;类成员变量在循环后重置?_C++_Loops_Member Variables - Fatal编程技术网

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

C++ C++;类成员变量在循环后重置?,c++,loops,member-variables,C++,Loops,Member Variables,在得到帮助之后,我被引导去做更好的调试。在这个过程中,我发现我的问题是: 在C++中工作时,尝试将类成员变量设置为值,而循环时不设置。我已经将我的代码简化为我认为最简单的代码,因为它仍然会产生错误 调用类移动器的一个函数,该函数修改变量pMovXPOS,然后可以在同一范围内(在该函数内)和从调用它的位置(在循环内)检索该变量。然而,在循环时,变量似乎被重置为其原始值 我在这里发布了整个测试代码。问题在于Main-test.cpp文件的RunWorld()函数。如果编译并运行,您应该会看到显示变量

在得到帮助之后,我被引导去做更好的调试。在这个过程中,我发现我的问题是:

在C++中工作时,尝试将类成员变量设置为值,而循环时不设置。我已经将我的代码简化为我认为最简单的代码,因为它仍然会产生错误

调用类移动器的一个函数,该函数修改变量pMovXPOS,然后可以在同一范围内(在该函数内)和从调用它的位置(在循环内)检索该变量。然而,在循环时,变量似乎被重置为其原始值

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

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

(我对C++是新的,我确信我使用的样式和/或方法有一些突出的问题。如果有任何重要的NOS,请自由指出。) 提前感谢您的帮助

//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;

您的问题是这一行:

TempMover = AllMovers.at(iMoverLoop);
您正在创建索引
iMoverLoop
处的
Mover
副本,然后修改该副本。向量中的对象永远不会被修改,在下一次迭代中,您的更改将丢失,因为
TempMover
会被
allmover
的下一个副本覆盖

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

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

您的问题是这一行:

TempMover = AllMovers.at(iMoverLoop);
您正在创建索引
iMoverLoop
处的
Mover
副本,然后修改该副本。向量中的对象永远不会被修改,在下一次迭代中,您的更改将丢失,因为
TempMover
会被
allmover
的下一个副本覆盖

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

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

你能举一个简单的例子来说明这个问题吗?是的,分而治之。把它分解成一个最小的例子。你可能会发现它很好用。然后,您将能够添加部件,直到它停止工作,您可以看到问题是什么。减少,请参见上文。还是不行-/@Gaffi您不应该在堆栈溢出时向标题添加已应答或类似的标记。问题列表显示有多少人回答了问题,如果答案被接受,数字将变为黄色,因此不需要任何其他指示。@Gaffi By reduce,我的意思是最多大约15行代码。你能举一个最小的例子来说明问题吗?是的,分而治之。把它分解成一个最小的例子。你可能会发现它很好用。然后,您将能够添加部件,直到它停止工作,您可以看到问题是什么。减少,请参见上文。还是不行-/@Gaffi您不应该在堆栈溢出时向标题添加已应答或类似的标记。问题列表显示有多少人回答了问题,如果答案被接受,数字将变为黄色,因此不需要任何其他指示。@Gaffi By reduce,我的意思是最多大约15行代码。+1,尽管TempMover在循环中没有超出范围,在每个循环的开始处,它被重置为向量中元素的值。@Skizz啊,是的,很高兴指出这一点,我在写答案时没有太注意代码。现在修好了真的这么简单吗!?!我曾尝试使用参考指示器,但在函数开始时,变量没有分配到哪里,这就产生了不同。非常感谢你+1,虽然TempMover在循环中没有超出范围,但在每个循环的开始处,它会被向量中元素的值重置。@Skizz啊,是的,很高兴指出这一点,我在写答案时没有太多注意代码。现在修好了真的这么简单吗!?!我曾尝试使用参考指示器,但在函数开始时,变量没有分配到哪里,这就产生了不同。非常感谢你!