2012-12-19 28 views
8

Das folgende ist eine gekürzte Version meiner Sprite-Klasse:C++ struct Initialisierung

class Sprite 
{ 
    struct SpriteState { 
     Vector3 position; 
     int width, height; 
     double rotation, scaling; 
    }; 
    std::map<int, SpriteState> stateVector; 
} 

Ich möchte ein SpriteState Objekt durch eine Elementfunktion erzeugen, die etwas entlang der Linien der folgenden aussieht:

SpriteState newSpriteState(
     Vector3 position = stateVector.rbegin()->second.position, 
     int width = = stateVector.rbegin()->second.width, 
     int height = = stateVector.rbegin()->second.height, 
     double rotation = stateVector.rbegin()->second.rotation, 
     double scaling = stateVector.rbegin()->second.scaling) 
    { SpriteState a; a.position = position; a.width = width; a.height = height; a.rotation = rotation; a.scaling = scaling; return a; } 

bekomme ich folgende Fehlermeldung:

a nonstatic member reference must be relative to a specific object

die Grundidee hinter der Klasse selbst ist Speichere die verschiedenen Zustände des Sprites, während es sich ändert, so dass ich bei Bedarf leicht in einen vorherigen Zustand zurückkehren kann. In den meisten Fällen wird der Sprite nur mit neuen Positionswerten aktualisiert, während Breite, Höhe, Rotation und Skalierung nahezu unverändert bleiben. Das bedeutet, dass ich nur den Positionswert ändere, während ich die Referenzen erneut aufrufe und erneut speichere Letzter Zustand für die anderen Werte gespeichert.

ich daher für die Funktion Standardwert in der Lage sein setzen möchte, so dass ich mühsam nicht die gleichen Werte immer wieder schreiben.

Allfällige Ideen zur Umsetzung?

+1

int width = '=' stateVector.rbegin() -> second.width? – billz

Antwort

1

Sie sollten eine Kopie des SpriteState machen und sie dann ändern:

SpriteState newSpriteState(stateVector.rbegin()->second); 
newSpriteState.width = someNewWidth; 
return newSpriteState; 

Jede Struktur und Klasse haben standardmäßig eine Kopie Konstruktor der folgenden Form:

ClassName(const ClassName&); 

, die standardmäßig Kopiert die Daten in der Klasse/Struktur.

+0

Ich habe dies für seine Kürze als Antwort ausgewählt. Vielleicht etwas außerhalb des Bereichs von OOP, aber ich würde meinen Code lieber einfach halten. Vielen Dank! – dk123

2

Überlastung es:

SpriteState newSpriteState(Vector3 position) 
{ 
    return newSpriteState(
      position, 
      stateVector.rbegin()->second.width, 
      stateVector.rbegin()->second.height, 
      stateVector.rbegin()->second.rotation, 
      stateVector.rbegin()->second.scaling)  
} 
2

Standard Argumente im Rahmen des Anrufers ausgewertet werden, so dass, wenn Sie ein Mitglied der Klasse zugreifen müssen, um den ‚Standard‘ Wert zu erhalten, können Sie nicht standardmäßig verwenden Argumente.

Auf der anderen Seite können Sie eine Überlastung verwenden, um die gleiche Wirkung zu erhalten:

SpriteState newSpriteState(
    Vector3 position, 
    int width, 
    int height, 
    double rotation, 
    double scaling) 
{ 
    SpriteState a; 
    a.position = position; 
    a.width = width; 
    a.height = height; 
    a.rotation = rotation; 
    a.scaling = scaling; 
    return a; 
} 

SpriteState newSpriteState(
    Vector3 position) 
{ 
    return newSpriteState(position, 
          stateVector.rbegin()->second.width, 
          stateVector.rbegin()->second.height, 
          stateVector.rbegin()->second.rotation, 
          stateVector.rbegin()->second.scaling); 
} 
/* ... And similar for additional non-default values. */ 
+0

Dies würde auf jeden Fall die genauere Ansatz sein, dies bei der Umsetzung. Ich entschied mich schließlich für Yidings Antwort, weil es kurz ist. Danke für die Antwort - ich werde auf jeden Fall auf zukünftige Versuche ähnlicher Aufgaben verweisen! – dk123

1

Member-Funktion der Teilnehmer nicht aufrufen kann. Man könnte es zu archivieren, indem Sie:

SpriteState newSpriteState(SpriteState sprite_state)   
{ 
    SpriteState a; 
    a.position = position; 
    a.width = width; 
    a.height = height; 
    a.rotation = rotation; 
    a.scaling = scaling; 
    return a; 
} 

Dann rufen Sie diese Funktion in einem anderen member function:

newSpriteState(stateVector.rbegin()->second);