在this question獲得幫助後,我被帶到更好的調試。在那個過程中,我發現我的問題是這樣的:C++類成員變量循環後重置?
在C++中工作時,嘗試將類的成員變量設置爲值,但循環時不起作用。我減少了我的代碼(遵循)到我認爲最簡單的代碼仍會產生錯誤。
調用類Mover的函數,修改變量pMovXPOS,然後可以在同一範圍內(在該函數內)以及從其調用的位置(在循環內)更新該變量。但是,循環時,似乎變量重置爲其原始值。
我在這裏發佈整個測試代碼。問題在於Main-test.cpp文件的RunWorld()函數。如果你編譯並運行,你應該看到顯示變量變化的輸出,然後被重置。
這是一個範圍問題?建設/銷燬問題?指針/參考問題?我不知道從哪裏開始(除了更好的調試)。 (因爲我是C++的新手,我確信在使用樣式和/或方法時有一些明顯的問題,如果有任何主要的no-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;
}
//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
您可以製作一個*最小*示例來顯示問題嗎? – Flexo 2012-02-22 11:06:01
是的,分而治之。將其分解爲一個最小的例子。你可能會發現它工作正常。然後,您可以添加零件,直到它停止工作,並且您可以看到問題所在。 – 2012-02-22 11:14:24
減少,請參閱上文。仍然不起作用。 : -/ – Gaffi 2012-02-22 11:17:04