2017-08-21 2 views
0

Ich habe Klasse, die eine QStateMachine enthält. Es hat auch ein paar QState* s.Sicherer Getter zu QStates

Ich initialisiere den Zustandsautomaten im Konstruktor und setze den Rechner in Betrieb.

Da die Zustände privat sind, aber ich möchte einem Benutzer erlauben, Unterklasse und ändern etwas Verhalten (z. B. Hinzufügen von Übergängen, ändern Eigenschaften, Verbindung zu Signalen e.t.c) Ich möchte einige Getter hinzufügen. Ich füge keine Setter hinzu, wie die Dokumentation besagt:

Das Entfernen von Zuständen, während die Maschine läuft, wird abgeraten.

Die QtCreator erzeugt so ähnlich:

QState *MyClass:state1() const 
{ 
    return m_state1; 
} 

das ist schön zu sein scheint.

Allerdings scheint es mir, dass dies meine Entscheidung auch auf nicht bereitstellt Setter umgeht, so etwas wie das möglich ist:

QState* state = state1(); 
*state = QState([...]); 

, die mein Verständnis der ursprünglichen state1 entfernt und überschreibt es mit einem neuen Zustand.

Also war mein Gedanke, eine const QState* stattdessen zurückzugeben.

const QState* MyClass::state() const 
{ 
    return m_state1; 
} 

Welche scheint zu arbeiten (das obige Beispiel einen Compiler-Fehler werfen). Aber ich bin so neu in C++, dass ich nicht sicher bin, ob ich weiß, was ich dort gemacht habe und ob es andere Implikationen gibt.

Was ist der richtige Weg, um mein gewünschtes Verhalten zu erreichen?

Antwort

1

Wenn Sie ein Benutzer möchte in der Lage sein, den Zustand abzurufen, aber nicht in der Lage den abgerufenen Statusobjekt zu beeinflussen, können Sie

const QState& MyClass::state() const 
{ 
    return *m_state1; 
} 

In diesem Fall einen konstanten Referenzrückgabetyp prüfen verwenden, das zurückgegebene Objekt ist vom Typ const QState& und kann daher nicht dem Empfängerobjekt eines nichtkonstanten Funktionsaufrufs zugewiesen werden. Wie für die richtige Möglichkeit, dieses Verhalten zu erreichen, führt die Rückgabe eines const QState* zu im Wesentlichen identischem Verhalten, aber erfordern eine De-Referenz mit -> für jeden Zugriff.

+0

Vielen Dank! Ich denke, dass ich ein bisschen mehr verstanden habe, aber ich habe erkannt, dass ich meinen Wunsch, wie z. Das 'QState'' addTransition' ist nicht const und benötigt einen normalen Zeiger auf ein anderes 'QState'. Daher muss ich den nicht konstanten Zugriff auf den Zeiger zulassen. – derM