2016-05-18 4 views
1

はプログラム説明反復は

私は三つのクラスがあります:A、BおよびCのこの質問の目的のために

は、クラスBは、単純にID変数が含まれており、それらのセッターとゲッターと一緒に、状態変数を作成します。

クラスAには、ユニットIDを使用してユニットを保存、削除、変更または比較する機能とともに、Bオブジェクトのベクトルが含まれています。

クラスCにはブラックボックスと通信する機能が含まれていますが、このブラックボックスにはクラスAと同じベクトルが含まれていますが、状態は更新されています。

この記事の末尾には、基本情報を含むクラスの大まかな例が示されています。

問題私はIDを取得したいすべての要素のクラスA.で見つかったベクトルを反復処理したい私のメインウィンドウで

、クラスCに渡し、そしてクラスが返すC持っています更新された状態。私は何を意味するかを説明するために原油を描いたsequence diagramです。

私の問題は、適切に[クラスCに送信されるIDを取得するためには、クラスAのベクトルを反復処理する方法です

私はこの時点で考えられてきたものは、以下に似て何かがあります(注:クラスAのベクトルが自動的にこの質問の目的のために移入さ):

int main() { 
    ... 
    ... 
    for(int i = 0; i < A.getVectorSize(); i++) { 
    char ID = A.getID(i); 
    bool state = C.getState(ID); 
    A.updateState(ID, state); 
    } 
} 

これは私がこのタスクを実行する方法についての提案を求めている理由である、正確には非常に鮮やかではありません。私はシステムの大まかな"Overview" imageを作成しました。私の図面の判読不能の謝罪。

クラス

class A { 
    public: 
    void updateStatus(char ID, bool status); 
    ... 
    ... 
    private: 
    vector<B> b_Storage; 
} 

class B { 
    public: 
    getters & setters 
    private: 
    char ID; 
    bool state; 
} 

class C { 
    public: 
    bool getState(char ID); 
    ... 
    private: 
    ... 
} 
+1

あなたのためにこれを行うAの関数があるようなサウンド。そうすれば、関数内でベクトルを直接操作することができます。 – NathanOliver

+0

私はそれが十分に素晴らしいと思います! – AhmadWabbi

答えて

2

あなたはmainに繰り返すが、代わりにAに反復を移動しないように選択できます

class A 
{ 
public: 
    void updateStates(std::function<bool(char)> f) 
    { 
      for (const auto& b: b_Storage) 
      { 
       updateStatus(b.id, f(b.id)); 
      } 
    } 
}; 

// ... 

int main() { 
    // ... 
    A a; 
    C c; 
    a.updateStates([&](char id) { return C.getState(id); }); 
} 

これはAの実装のmainは、複数の独立します。

+0

最も賢明なもののようです。 私はまだC++プログラミングの初心者ですから、ここで何が起きるのか分かりません。 ** a.updateStates([&](char id) - > bool {return CgetState(id); }); ** – NT93

+1

@ trick4GLTEパラメータはラムダ式です。無名関数の定義あなたはそれについて読むことができます。 [ここ](http://www.umich.edu/~eecs381/handouts/Lambda.pdf)。あなたが合理的に新しい本(2011年以降のようなもの)から学んでいるなら、それはそれらをカバーすべきです。 – molbdnilo

+0

ありがとう、それを調べようとします。 – NT93

0

あなたの問題がプライベートである、b_Storageの要素を反復されている場合は、クラスAに2つのパブリックメソッドを追加することにより、イテレータを使用して試みることができる:

std::vector<B>::iterator begin() { 
return b_Storage.begin(); 
} 
std::vector<B>::iterator end() { 
return b_Storage.end(); 
} 

これらのイテレータを使用してb_Storageの要素にアクセスします。