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: Lors de la compilation, cela me donne l'erreur suivante: p> 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 à Des idées? P> P> P> d code> sans utiliser l'opérateur conditionnel. P>
3 Réponses :
Cast to D & code> dans les deux branches:
D& d = (rand() %2 == 0 ? static_cast<D&>(c.getD1()) : static_cast<D&>(c.getD2()));
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 & code> implicitement.
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;
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 &) code> 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.
ou vous pouvez modifier les types de retour des fonctions à la classe de base. P>
Cela poivrer le reste du code à l'aide des deux getters avec des moules dynamiques, ce n'est pas vraiment une solution