2016-09-21 30 views
0

我對C++很新穎,所以我對指針有很多問題,儘管我理解這個概念。問題是,我做我的主指針的向量:收集指向對象的指針,澄清

主/ Aquarium.cpp

using namespace std; 
#include "EntityControl.h" 
#include <Windows.h> 

int main() { 

    EntityControl entity; 
    vector<Fish*> fishVector; 
    Fish q; 
    cout << "fish q = " << &q << endl; 
    fishVector.push_back(&q); 

     entity.movementController(&fishVector); 
     cout << &fishVector << endl; 
     system("pause"); 
    return 0; 
} 

正如你可以看到我添加在這裏你可以找到魚的位置fishVector,然後我想對EntityControl類中的對象做些什麼。但我不知道如何做到這一點,我嘗試使用for循環來獲取它,但當試圖找出結果時,位置與main.cpp中的魚不同。

EntityControl.cpp

#include "EntityControl.h" 


void EntityControl::movementController(std::vector<Fish*> * fishInputVector) 
{ 
     unsigned int x = rand() % xContainer; 
     unsigned int y = rand() % yContainer; 
     unsigned int z = rand() % zContainer; 
     //i.changePosition(x, y, z); 
} 

EntityControl::~EntityControl() 
{ 
} 

有這個計算器上的幾個帖子,但我不明白的答案。我以爲我需要一些額外的幫助。所以,如果你能儘可能簡單地解釋它,那麼我會非常感激。

問題澄清:添加魚對象的存儲位置,以在一個載體(或足夠的任何集合)主然後接收所述存儲位置和與所述對象的工作,該存儲器位置指向EntityControl.cpp

額外的問題: 我認爲我需要一個指針來改變一個類的實際變量的值,但是,

void Fish::changePosition(int addX, int addY, int addZ) 
{ 
    xLocation = addX; 
    yLocation = addY; 
    zLocation = addZ; 

    //std::cout <<"VALUE ="<< getX(); 
} 

似乎很好地工作,你能解釋一下嗎? (X,Y,Z位置是在魚類中的私有全局變量)

  • 如果我做一個指針,我應該刪除的對象/變量,它的 指向?它留在內存中嗎?

  • 有什麼好的資源可以幫助我嗎?

最後一個音符 如果有人能幫助我,非常感謝你。這個問題一直讓我瘋狂幾個小時。

+0

是的,應該刪除那個cout,因爲它不需要處理這個問題。它只是用於測試目的 – Lloyd

+0

我正在測試它是否與我發送到應該從代碼塊中刪除的方法相同的向量,反正會有多條魚添加到向量中,這就是爲什麼我不僅送一條魚到那裏。 感謝您的評論 – Lloyd

+0

關於額外的問題:你寫的函數是'Fish'類('Fish ::')的一部分,所以它可以修改'Fish'的任何數據成員,即使是私有成員。否則,私人數據成員將是毫無意義的。您不需要指針來訪問或修改數據成員。你從哪裏得到那個的?數據成員名稱引用會自動引用調用成員函數的實例的數據成員。 – user4407569

回答

0

由於movementController的參數是一個指針,因此您需要間接通過它來訪問該向量。而且由於矢量的元素是指針,所以你需要間接地通過它們。因此,在movementController代碼可能是這樣的:

void EntityControl::movementController(std::vector<Fish*> * fishInputVector) 
{ 
    for (auto fish_ptr : *fishInputVector) { 
     unsigned int x = rand() % xContainer; 
     unsigned int y = rand() % yContainer; 
     unsigned int z = rand() % zContainer; 
     fish_ptr->changePosition(x, y, z); 
    } 
} 
+0

正是我在找的東西,謝謝 – Lloyd

0

我敢肯定不是100%,我明白你的問題,但你似乎誤解指針。

我相信你正試圖做所謂的「解除引用」。這是一個允許你調用指針引用的對象的方法的操作。你的方法應該如下:

void EntityControl::movementController(std::vector<Fish*> * fishInputVector) 
{ 
    for(int i = 0; i < fishInputVector->size(); i++) 
    { 
     unsigned int x = rand() % xContainer; 
     unsigned int y = rand() % yContainer; 
     unsigned int z = rand() % zContainer; 
     fishInputVector->at(i)->changePosition(x,y,z); 
    } 
} 

我在這裏已經改變了兩件事情:我引用fishInputVector的第i個元素,這是一個指針。接下來,我使用解引用運算符->,它允許您訪問指針所指向的變量上的函數/變量。

+0

你說得對,我錯過了,我想@Barmar但是他的回答在工作示例中確實更加正確 – user2647513

+0

他們幾乎相當,我只是使用更簡潔的語法,使用C++ 11'for-range'特性如果他們需要支持早期的C++實現,那麼你的版本將是必要的。 – Barmar