8
votes

Problème de l'opérateur conditionnel

J'ai des problèmes avec l'utilisation de l'opérateur conditionnel pour obtenir une référence à un objet. J'ai une configuration similaire à celle-ci: xxx

Lors de la compilation, cela me donne l'erreur suivante: xxx

Je comprends que c'est illégal est illégal Selon la norme C ++ ( comme indiqué dans ce blog post ), mais je n'ai pas 't savoir comment obtenir ma référence à d sans utiliser l'opérateur conditionnel.

Des idées?


0 commentaires

3 Réponses :


14
votes

Cast to D & code> dans les deux branches:

D& d = (rand() %2 == 0 ? static_cast<D&>(c.getD1()) : static_cast<D&>(c.getD2()));


2 commentaires

Vous avez seulement besoin d'un des cases ici aussi, ce qui rend l'expression un peu moins verbeuse.


@Richard, ah bonne note. Pour moi, il semble plus facile si j'applique la distribution aux deux opérandes, mais vous êtes bien sûr correct, une fonte suffit à faire voir le compilateur que l'autre peut être converti en D & implicitement.



2
votes

BTW, vous n'avez pas vraiment besoin d'utiliser un opérateur conditionnel,

D* dptr; if(rand() %2 == 0) dptr = &c.getD1(); else dptr = &c.getD2();
D& d = *dptr;


4 commentaires

Cela semble être un peu gaspillé. Y a-t-il un avantage à cette approche vers l'opérateur ternaire?


C'est vrai, mais je trouve que le code a l'air CLUNKY si vous le faites (l'utilisation de la référence a l'air plus propre).


Stephen, je fournissais seulement une réponse en réponse à l'OP "mais je ne sais pas comment obtenir ma référence à D sans utiliser l'opérateur ternaire"


Je soupçonne que cela tombe dans la catégorie "Préférence personnelle": Je le trouve moins maladroit, d'autant plus que dans ce cas, un normal (D &) est suffisant (casting à la classe de base) de sorte que l'opérateur ternaire est parfaitement lisible et vous n'avez pas de variable supplémentaire qui sera inutilisé plus tard. Je ne suis pas sûr que la distribution est qualifiée d'utilisation RTTI. Votre réponse, cependant, est parfaitement valide, je ne comprends pas pourquoi c'était voté à la fois.



0
votes

ou vous pouvez modifier les types de retour des fonctions à la classe de base.


1 commentaires

Cela poivrer le reste du code à l'aide des deux getters avec des moules dynamiques, ce n'est pas vraiment une solution