Переменные членов класса C ++, сбрасываемые после цикла? - PullRequest
0 голосов
/ 22 февраля 2012

После получения справки по этому вопросу меня заставили лучше отладить. В этом процессе я обнаружил, что моя проблема заключается в следующем:

При работе в C ++ попытка установить переменную-член класса в значение работает, но не во время цикла. Я сократил свой код (чтобы следовать) до того, что, по моему мнению, является самым простым, поскольку оно все еще вызывает ошибку.

Вызов функции класса Mover, которая изменяет переменную pMovXPOS, которая затем может быть получена как обновленная в той же области (в той же функции) и из того места, где она была вызвана (в цикле). Однако после зацикливания кажется, что переменная сбрасывается в исходное значение.

Я публикую здесь полный код теста. Проблема заключается в функции RunWorld () файла Main-test.cpp. Если вы скомпилируете и запустите, вы должны увидеть вывод, который показывает изменение переменной, а затем ее сброс.

Это проблема области? Вопрос строительства / разрушения? Проблема с указателем / ссылкой? Я не уверен, с чего начать (кроме лучшей отладки).

(Поскольку я новичок в 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

1 Ответ

3 голосов
/ 22 февраля 2012

Ваша проблема в этой строке:

TempMover = AllMovers.at(iMoverLoop);

Вы создаете копию Mover с индексом iMoverLoop, затем модифицируете эту копию. Объект в векторе никогда не изменяется, и на следующей итерации ваши изменения будут потеряны, так как TempMover перезаписывается следующей копией из AllMovers

Один из способов обойти это - использовать ссылку для TempMover. Например:

Mover& tempMover = AllMovers.at(iMoverLoop);
tempMover.DoMove();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...