Question

Après avoir obtenu de l'aide sur cette question, J'ai été amené à mieux déboguer. Dans ce processus, j'ai découvert que mon problème est le suivant:

Tout en travaillant en C ++, tentant de définir la variable de membre d'une classe sur une valeur fonctionne, mais pas lors du boucle. J'ai réduit mon code (à suivre) à ce que je crois être le plus simple car cela produit encore l'erreur.

Appelant une fonction du moteur de classe qui modifie la variable PMOVXPOS, qui peut ensuite être récupérée comme mise à jour dans la même portée (dans cette fonction) et à partir de l'endroit où il a été appelé (dans la boucle). Cependant, lors de la boucle, il semble que la variable soit réinitialisée à sa valeur d'origine.

Je publie l'intégralité du code de test ici. Le problème réside dans la fonction runworld () du fichier principal-test.cpp. Si vous compilez et exécutez, vous devriez voir la sortie qui montre la variable changeant, puis réinitialisant.

Est-ce un problème de portée? Un problème de construction / destruction? Un problème de pointeur / référence? Je ne sais pas par où commencer (au-delà du meilleur débogage).

(Comme je suis nouveau dans C ++, je suis sûr qu'il y a des problèmes flagrants avec le style et / ou les méthodes que j'ai utilisées. S'il y a un NO-NOS majeur, veuillez les signaler.)

Merci d'avance pour votre aide!

//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
Était-ce utile?

La solution

Votre problème est cette ligne:

TempMover = AllMovers.at(iMoverLoop);

Vous créez une copie du Mover c'est à l'index iMoverLoop, puis modifiant cette copie. L'objet qui se trouve dans le vecteur n'est jamais modifié et lors de la prochaine itération, vos modifications sont perdues, comme TempMover est écrasé avec la prochaine copie de AllMovers

Une façon de contourner cela serait d'utiliser une référence pour TempMover Au lieu. Par exemple:

Mover& tempMover = AllMovers.at(iMoverLoop);
tempMover.DoMove();
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top