2016-09-21 7 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() 
{ 
} 

はStackOverflowの上でこののいくつかの記事がありましたが、私は答えを理解していませんでした。私はもう少し助けが必要だと思った。あなたがそれを簡単に説明できるなら、私はとても感謝しています。

問題解明:のベクトル(または十分である任意のコレクション)に魚オブジェクトのメモリ・ロケーションを追加、メモリ位置を受信し、オブジェクトを扱う主とメモリ位置点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

はい、おそらくその質問を削除する必要がありますので、質問とは関係ありません。テスト目的のためだけだった – Lloyd

+0

私はそれがブロックコードから削除されるべきメソッドに送信するのと同じベクトルであればテストしていましたが、とにかく複数の魚がベクターに追加されます1匹の魚をそこに送ってください。 あなたのコメント – 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