2017-08-21 5 views
0

J'ai class, contenant un QStateMachine. Il a également un couple de QState* s.Getter sûr à QStates

private: 
QStateMachine m_machine; 
QState* m_state1 
QState* m_state2 
... 

J'initialise la machine d'état dans le constructeur et active la machine. Comme les états sont privés, mais je veux permettre à un utilisateur de sous-classer et de modifier un certain comportement (par exemple ajouter des transitions, changer les propriétés, se connecter à des signaux par exemple). Je veux ajouter quelques getters. Je n'ajoute pas de setters, comme l'indique la documentation:

La suppression des états pendant le fonctionnement de la machine est déconseillée.

Le produit QtCreator quelque chose comme ça:

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

qui semble agréable.

Cependant, il me semble que cela aussi circonvient ma décision ne fournissant pas setters, comme quelque chose comme ça est possible:

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

qui, à ma compréhension supprime le state1 original et remplace par un nouvel état.

Donc, mon idée était de retourner un const QState* à la place.

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

Ce qui semble au travail (l'exemple ci-dessus va lancer une erreur du compilateur). Cependant, je suis si nouveau au C++ que je ne suis pas sûr de savoir ce que j'ai fait là-bas et s'il y a d'autres implications.

Quelle est la bonne façon d'obtenir le comportement désiré?

Répondre

1

Si vous voulez un utilisateur pour pouvoir récupérer l'état, mais être incapable d'affecter l'objet d'état récupéré, vous pouvez envisager d'utiliser un type de retour de référence constante

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

Dans ce cas, l'objet retourné est de type const QState&, de sorte qu'il ne peut pas être affecté à ou être l'objet récepteur d'un appel de fonction non const. En ce qui concerne droite pour obtenir ce comportement, renvoyer un const QState* entraînera un comportement essentiellement identique, mais nécessite une référence avec -> pour chaque accès.

+0

Merci! Je pense que j'ai compris un peu plus, cependant j'ai réalisé, que je ne peux pas imposer mon désir, comme par ex. le 'QTransaction'' QState's n'est pas const, et nécessite un pointeur normal vers un autre 'QState'. Par conséquent, je dois autoriser l'accès non-const au pointeur. – derM