2016-05-18 5 views
1

ProgrammbeschreibungIterate durch Vektor in einer anderen Klasse enthalten

Ich habe drei Klassen: A, B und C.

Für die Zwecke dieser Frage, Klasse B enthält lediglich eine ID-Variable und eine Statusvariable, zusammen mit Setter und Getter für diese.

Klasse A enthält einen Vektor von B-Objekten sowie Funktionen zum Speichern, Löschen, Ändern oder Vergleichen von Einheiten mit einer Einheiten-ID.

Klasse C enthält Funktionen zum Sprechen mit einer schwarzen Box, diese schwarze Box enthält den gleichen Vektor von B wie Klasse A, aber mit aktualisierten Zuständen.

Grobe Beispiele der Klassen mit grundlegenden Informationen wird am Ende dieses Beitrags angezeigt.

Problem

In meinem Hauptfenster ich durch den Vektor in der Klasse A. Für alle Elemente, die ich die ID erhalten möchten gefunden iterieren möchten, geben es an der Klasse C, und haben Klasse C eine Rückkehr Aktualisierter Status Ich habe eine grobe sequence diagram gezeichnet, um zu veranschaulichen, was ich meine.

Mein Problem ist, wie man richtig in der Klasse A durch den Vektor zu durchlaufen, um die ID zu erhalten, die dann in die Klasse C gesendet wird

Was ich an dieser Stelle betrachtet ist so etwas wie die folgenden (Anmerkung: der Vektor in der Klasse A wird automatisch für die Zwecke dieser Frage bevölkert):

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

Dies ist nicht gerade sehr brillant, weshalb ich für Anregungen auf die Frage, wie diese Aufgabe zu erfüllen. Ich habe eine grobe "Overview" image des Systems erstellt. Entschuldigung für die Unlesbarkeit meiner Zeichnungen.

Klassen

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

Klingt wie es sollte eine Funktion in A sein, die das für Sie tut. Auf diese Weise können Sie mit dem Vektor direkt in der Funktion arbeiten. – NathanOliver

+0

Ich denke, es ist brillant genug! – AhmadWabbi

Antwort

2

Sie wählen konnte nicht in main, zu wiederholen, sondern die Iteration in A bewegen:

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); }); 
} 

Dies macht main unabhängiger von A ‚s Umsetzung.

+0

Scheint als das Vernünftigste. Ich bin immer noch ziemlich der Neuling bei C++ - Programmierung, so bin ich mir nicht sicher, was hier passiert: ** a.updateStates ([&] (char-id) -> bool {return C.getState (ID); }); ** – NT93

+1

@ trick4GLTE Der Parameter ist ein Lambda-Ausdruck; eine Definition einer anonymen Funktion. Sie können darüber lesen, z.B. [hier] (http://www.umich.edu/~eecs381/handouts/Lambda.pdf). Wenn Sie von einem relativ neuen Buch (etwa 2011 oder später) lernen, sollte es sie abdecken. – molbdnilo

+0

Vielen Dank, ich werde versuchen, es zu untersuchen. – NT93

0

Wenn Ihr Problem ist über die Elemente von b_Storage iterieren, was privat ist, könnten Sie versuchen, Iteratoren mit zwei öffentliche Methoden in der Klasse A und fügte hinzu:

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

und benutze diese Iteratoren, um auf die Elemente von b_Storage zuzugreifen.