Domanda

Dopo aver ricevuto aiuto questa domanda, Sono stato portato a fare un migliore debug. In quel processo, ho scoperto che il mio problema è questo:

Mentre si lavora in C ++, tentare di impostare una variabile membro di classe su un valore funziona, ma non durante il ciclo. Ho ridotto il mio codice (da seguire) a quello che credo sia il più semplice per ciò produce ancora l'errore.

Chiamando una funzione del motore di classe che modifica il pMovxpos variabile, che può quindi essere recuperato come aggiornato all'interno dello stesso ambito (all'interno di quella funzione) e da dove è stato chiamato (all'interno del ciclo). Tuttavia, al momento del loop, sembra che la variabile venga ripristinata al suo valore originale.

Sto pubblicando l'intero codice di prova qui. Il problema risiede nella funzione run-world () del file main test.cpp. Se si compila ed esegui, dovresti vedere l'output che mostra la variabile che cambia, quindi essere ripristinato.

È un problema di portata? Un problema di costruzione/distruzione? Un problema di puntatore/riferimento? Non sono sicuro da dove cominciare (oltre il migliore debug).

(Dato che non sono nuovo a C ++, sono sicuro che ci sono alcuni problemi evidenti con stile e/o metodi che ho usato. Se ci sono un no-NOS importante, ti preghiamo di sottolineare quelli.)

Grazie in anticipo per qualsiasi aiuto!

//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
È stato utile?

Soluzione

Il tuo problema è questa riga:

TempMover = AllMovers.at(iMoverLoop);

Stai creando una copia del Mover Questo è all'indice iMoverLoop, quindi modificando quella copia. L'oggetto che si trova nel vettore non viene mai modificato e alla successiva iterazione le modifiche vengono perse, come TempMover è sovrascritto con la prossima copia da AllMovers

Un modo per aggirare questo sarebbe quello di usare un riferimento per TempMover invece. Per esempio:

Mover& tempMover = AllMovers.at(iMoverLoop);
tempMover.DoMove();
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top