2016-04-14 9 views
0

Ich bin ein Ökosystem in C++ zu machen, wo jedenANIMAL auf meinem playing_field wird grow_older() am Ende des Jahres.Erhöhungsschritte nicht-statische Variable über statische Funktion

class ANIMAL 
{ 
private: 
    int age; 

public: 

    ANIMAL() 
    { 
    age=0; 
    } 

    static void grow_older(){ age++; } 
}; 

Ich weiß, dass static methods can only use static data, aber gibt es eine elegante Möglichkeit, etwas ähnlich ein ANIMAL.grow_older(); haben? Ich könnte iterieren durch meine playing_field und rufen Sie grow_older(); auf jedes Tier, aber ich hatte gehofft, es gibt ein Konzept da draußen, dass ich nicht bewusst, dass die Iteration durch jede Instanz von ANIMAL explizit vermeidet.

+0

Sie sollten C++ als Tag einfügen, wenn Sie hier Fragen zu C++ stellen. – Laurel

+1

Wenn jedes Tier eine eigene "age" -Instanz benötigt, können Sie stattdessen einen festen Datenmember 'time_of_birth' speichern und nur eine statische' current_time' inkrementieren ... und dann die Differenz nur bei Bedarf berechnen. Wenn ein "ANIMAL" "geboren" (konstruiert?) Ist, würden Sie "time_of_birth = current_time;" zuweisen. – mah

+1

Aber ... Diese Anfrage ergibt für mich keinen Sinn. Ein Tier ist keine Sammlung von Tieren. –

Antwort

1

Es gibt keine elegante Möglichkeit, den Wert von Datenelementen aus vielen Objekten gleichzeitig zu erhöhen, so dass Ihre Optionen entweder eine einzige statische (die ich für Ihren Anwendungsfall nicht gültig ist) zu haben scheint age von allen Objekten nacheinander (durch Iteration durch den Container, in dem sie sich befinden, um sie zu finden) oder eine andere Lösung vollständig übernehmen.

Eine mögliche alternative Lösung ist nicht age als Datenelement zu speichern überhaupt, aber speichern eher ein time_of_birth als Datenelement und auch Spur eines current_time als statisches Datenelement zu halten. Ihre Klasse würde dann in etwa so aussehen:

class ANIMAL 
{ 
private: 
    int time_of_birth; 
    static int current_time; 

public: 

    ANIMAL() 
    { 
    time_of_birth=current_time; 
    } 

    static void grow_older(){ current_time++; } 

    int age() { return current_time - time_of_birth; } 
}; 
int ANIMAL::current_time = 0; /* defined in a source, not header file */ 

Wenn jedes Mal, wenn Sie das Alter erhöhen müssen Sie auch das Alter untersuchen müssen (zum Beispiel zu sehen, ob das Tier tot sein muss), hat es wahrscheinlich keine Einsparungen weil du ohnehin deine Menagerie durchgehen musst. Auf der anderen Seite, wenn Sie das Alter nicht mehr als (oder mehr) als nötig untersuchen müssen, um es zu erhöhen, sollte dieser Ansatz besser funktionieren, da weniger Arbeit benötigt wird.

+0

Das hat alles aufgeklärt. Obwohl das, wonach ich gefragt habe, hack-ish aussieht, macht das was du machst Sinn. Vielen Dank! – user3487243