2012-02-22 25 views
0

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 
+6

您可以製作一個*最小*示例來顯示問題嗎? – Flexo 2012-02-22 11:06:01

+0

是的,分而治之。將其分解爲一個最小的例子。你可能會發現它工作正常。然後,您可以添加零件,直到它停止工作,並且您可以看到問題所在。 – 2012-02-22 11:14:24

+0

減少,請參閱上文。仍然不起作用。 : -/ – Gaffi 2012-02-22 11:17:04

回答

3

你的問題是這樣的一行:

TempMover = AllMovers.at(iMoverLoop); 

正在創建的Mover的副本是該指數在iMoverLoop,然後修改該副本。這是在載體中的對象不會被修改,並且對下一個迭代的修改都會丟失,如TempMover改寫爲下副本從AllMovers

一個辦法來解決這個問題是使用一個參考的TempMover代替。例如:

Mover& tempMover = AllMovers.at(iMoverLoop); 
tempMover.DoMove(); 
+0

+1,雖然TempMover不會在循環中超出範圍,但會在每個循環的開始處使用向量中元素的值進行重置。 – Skizz 2012-02-22 11:23:05

+0

@Skizz啊,是的,歡呼指出,沒有太多的關注代碼,因爲我寫了我的答案。現在修好了 – obmarg 2012-02-22 11:24:59

+0

真的太簡單了!?!我曾嘗試過使用參考指標,但是在函數開始時,並沒有指定變量的位置,而是取得了區別。非常感謝! – Gaffi 2012-02-22 11:27:23