Array als Rückgabewert
-
Erst mal zu dem Problem, das ich habe:
Ich schreibe mir gerade ein DXInput Klasse, um auf die Tastenabfrage meiner Tastatur eingehen zu können. Hierzu wird in der Klasse "Game" eben ein solches Object angelegt.
Der Tastenstatus an sich ist ein bool array[256].
Bei jedem durchlauf wird die funktion "GetKeyState" aufgerufen, die mir in meinem Array die Werte ändert.
Ok, bis dahin kein Problem.
Mein Problem ist jetzt allerdings, das ich dieses bool array gerne auf ein lokales, sprich auf einen member der Klasse "Game" "kopieren" möchte.
Allerdings kann man als Rückgabewert ja leider keine kompletten arrays angeben.Ich könnte, das KeyStateArray auch public machen, ist aber denke ich nicht Sinn der Sache.
Wie schaffe ich es also ein komplettes Array aus einem objekt in ein anderes zu kopieren, ohne ein und die selbe Funktion 500 mal aufrufen zu müssen?
mfg
-
Benutze lieber std::tr1::array. Arrays kannst du in C und C++ nämlich nicht zurückgeben.
-
Die Frage ist, brauchst du wirklich eine komplette Kopie des Array's?
Warum alles doppelt speichern und das Risiko von Dateninkonsistenz riskieren.
Eine Referenz oder ein Zeiger auf das Array sollte an und für sich doch reichen.
Oder etwa nicht?
-
Kann ein Zeiger nicht auch nur auf 1 Element des Arrays zeigen?
Wenn ja, wäre das ja das selbe in Grün.
-
Elemente von Arrays liegen hintereinander im Speicher. Wenn du einen Zeiger auf ein Arrayelement hast und diesen inkrementierst, zeigt er deswegen auf das nächste Array-Element. Deswegen kannst du z.B. einen Zeiger auf das erste Element und die Größe des Arrays zur Verfügung stellen.
Eine andere (m.E. bessere) Möglichkeit: die Klasse DXInput bietet Zugriffsfunktionen auf das Array, z.B.
bool GetKeyState(int keyindex) const;. In den Fällen, wo du jetzt das Array kopieren willst, übergibst du stattdessen eine Refenz auf das DXInput-Objekt. Die entsprechende Klasse / Funktion kann dann von dieser die benötigten Tasten erfragen.
Vorteile dieser Variante: du sparst Overhead, eine Referenz kopiert sich viel schneller als 256 bool-Werte und du bewirkst eine zusätzliche Kapselung der Daten zu Gunsten einer allgemeinen Schnittstelle. Dadurch fällt es später viel leichter, die Implementierung zu verändern, z.B. dass inDXInput::GetKeyStatedirektGetKeyStateoderGetAsyncKeyStateaufgerufen wird, anstatt in jedem Durchgang alle Tasten pauschal abzufragen.