2016-05-18 58 views
1

程序說明迭代通過向量包含在另一個類

我有三個類:A,B和C.

對於這個問題的目的,B類簡單地包含一個ID變量,和一個狀態變量,以及那些設置者和獲取者。

A類包含一個B對象向量,以及使用單位ID存儲,刪除,修改或比較單位的函數。

C類包含與黑盒交談的功能,該黑盒包含與A類相同的B向量,但具有更新的狀態。

這篇文章的結尾部分顯示了具有基本信息的類的粗略示例。

問題

在我的主窗口,我想通過在A類發現所有我希望得到的ID元素的矢量迭代,它傳遞到C級,並有C類返回更新的狀態。我畫了一個粗略的sequence diagram來說明我的意思。

我的問題是如何正確地通過在A級矢量迭代,以獲得ID,然後將其發送到C類

我在這一點上已經算得上是一個類似於以下(注:一類向量自動填充這個問題的目的):

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系統。對於我的圖紙是不可信的道歉。

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

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

聽起來就像在那裏應該有一個功能,爲你做到這一點。這樣你可以直接在函數中使用矢量。 – 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); }); 
} 

這使得main更加獨立A的實現。

+0

看起來像最明智的事情。我不確定這裏發生了什麼: ** a.updateStates([&](char id) - > bool {return C.的getState(ID); }); ** – NT93

+1

@ trick4GLTE該參數是一個lambda表達式;匿名函數的定義。你可以閱讀它,例如[這裏](http://www.umich.edu/~eecs381/handouts/Lambda.pdf)。如果你從一本合理的新書(如2011年或以後)學習,它應該涵蓋它們。 – molbdnilo

+0

謝謝,會試着去研究它。 – NT93

0

如果您的問題被迭代的b_Storage的元素,這是私人的,你可以通過添加在A級兩個公共方法嘗試使用迭代器並使用這些迭代器訪問b_Storage的元素。