C ++クラスのメンバー変数ループ後にリセットされますか?
-
29-10-2019 - |
質問
助けを得た後 この質問, 、私はより良いデバッグをするように導かれました。そのプロセスで、私は私の問題がこれであることを発見しました:
C ++で作業している間、クラスのメンバー変数を値に設定しようとすることを試みますが、ループ中はそうではありません。コード(従う)を、エラーを引き起こしているため、最も単純だと思われるものに削減しました。
変数PMOVXPOSを変更するクラスムーバーの関数を呼び出します。これは、同じスコープ内(その関数内)およびそれが呼び出された場所(ループ内)内で更新されるように取得できます。ただし、ループすると、変数は元の値にリセットされているようです。
ここにテストコードの全体を投稿しています。問題は、メインテスト.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
, 、そのコピーを変更します。ベクトル内にあるオブジェクトは決して変更されず、次の反復では変更が失われます。 TempMover
次のコピーから上書きされます AllMovers
これを回避する1つの方法は、の参照を使用することです TempMover
代わりは。例えば:
Mover& tempMover = AllMovers.at(iMoverLoop);
tempMover.DoMove();
所属していません StackOverflow