Déclarer plusieurs pointeurs d'objet sur une ligne de causes d'erreur du compilateur
quand je fais cela (dans ma classe)
public:
Entity()
{
re_sprite_eyes = new sf::Sprite();
re_sprite_hair = new sf::Sprite();
re_sprite_body = new sf::Sprite();
}
private:
sf::Sprite* re_sprite_hair;
sf::Sprite* re_sprite_body;
sf::Sprite* re_sprite_eyes;
Tout fonctionne bien. Cependant, si je change les déclarations à ceci:
private:
sf::Sprite* re_sprite_hair, re_sprite_body, re_sprite_eyes;
J'obtiens cette erreur de compilateur:
error: no match for 'operator=' in '((Entity*)this)->Entity::re_sprite_eyes = (operator new(272u), (<statement>, ((sf::Sprite*)<anonymous>)))
Et puis il dit que les candidats pour re_sprite_eyes
sont sf::Sprite
objets et/ou des références.
Pourquoi n'est-ce pas le travail? Ne sont pas les déclarations de la même manière?
Vous avez découvert une propriété intéressante de C/C++ déclarations: l'astérisque appartient à la variable, pas le type. Une bonne façon de toujours vous rappeler est de mettre un espace après le type et avant l'astérisque.
OriginalL'auteur | 2012-11-29
Vous devez vous connecter pour publier un commentaire.
sf::Sprite* re_sprite_hair, re_sprite_body, re_sprite_eyes;
Ne prononce pas 3 - pointeurs, il est un pointeur et 2 objets.
sf::Sprite*
malheureusement ne s'applique pas à toutes les variables déclarées à la suite, juste le premier. Il est équivalent àQue vous voulez faire:
sf::Sprite *re_sprite_hair, *re_sprite_body, *re_sprite_eyes;
Vous avez besoin de mettre une étoile pour chaque variable. Dans de tels cas, je préfère garder l'étoile sur la variable de côté, plutôt que du type, de faire exactement cette situation claire.
C'est bizarre... pas la façon dont je l'aurais fait, mais merci!
Voir Jean Bode de la réponse et la mienne pour les explications.
OriginalL'auteur Karthik T
En C et C++, le
*
se lie à la de demande de déclaration, pas le spécificateur de type. Dans les deux langues, les déclarations sont basées sur les types de expressions, pas des objets.Par exemple, supposons que vous avez un pointeur vers un
int
nommép
, et vous souhaitez accéder à laint
valeurp
points; vous le faites par le déréférencement de pointeur avec le unaire*
opérateur, comme suit:Le type de la expression
*p
estint
; par conséquent, la déclaration dep
estC'est vrai, n'importe comment beaucoup de pointeurs vous déclarez dans la même déclaration; si
q
etr
doivent également être déclarés comme des pointeurs, alors ils doivent aussi avoir le unaire*
dans le cadre de la déclaration:parce que le expressions
*q
et*r
de typeint
. C'est un accident de C et de C++, la syntaxe que vous pouvez écrireT *p
,T* p
, ouT * p
; l'ensemble de ces déclarations sera interprété commeT (*p)
.C'est pourquoi je ne suis pas fan du style C++ de la déclaration de pointeur et les types de référence
car elle implique une vision erronée de la façon dont le C et le C++ syntaxe de déclaration de travaux, conduisant à la exacte genre de confusion que vous venez de vivre. Cependant, j'ai écrit assez de C++ pour réaliser qu'il y a des moments, quand le style ne l'intention de le code plus clair, en particulier lors de la définition des types de conteneurs.
Mais c'est encore faux.
L'utilisation de & pour indiquer une référence est un C++ construction qui ne siègent pas bien avec le C d'origine déclarations. Retour dans la journée, j'avais des réserves sur la façon dont les références sont saisies en C++, en partie à cause de cela. L'adresse de l'opérateur est surchargé d'une manière confuse - pas aussi mal que << et >> difficile. 🙂
Aussi loin que la syntaxe est concerné,
T& r
est "mauvais" (c'est interprétée commeT (&r)
, afin de multiples déclarations doivent être écritsT &r, &s, &q
). Je comprends le point vous êtes à la décision (&x
a typeT *
, pasT
), et oui, la surcharge&
cette manière provoque certains des brûlures d'estomac.Sauf dans ce cas précis (que vous ne devriez pas faire, quand même) (et, bon, certains archanely-écrit des types complexes, si vous êtes si incliné) il ne pouvait pas être de moins en conséquence, de sorte que le C++ style est présent de qualité supérieure dans l'ensemble. C'est pas "mauvais". Droit-l'alignement de vos symboles juste pour flatter un antique bizarrerie de la langue lui-même est l'un des plus grands abstraction des fuites.
OriginalL'auteur John Bode
En C++11, vous avez une jolie solution de contournement, ce qui pourrait être mieux que de transférer des espaces en arrière:
OriginalL'auteur rici
De http://www.cplusplus.com/doc/tutorial/pointers/
OriginalL'auteur Robin Nag
L'astérisque se lie à l'pointeur-nom de la variable. La façon de se souvenir de ce qui est à remarquer qu'en C/C++, les déclarations imiter utilisation.
Les pointeurs peut être utilisée comme ceci:
De même,
Dans les deux cas, il y a un type sous-jacent, prescripteur, et le ou les opérateurs nécessaires pour "obtenir" un objet de ce type dans une expression.
OriginalL'auteur Jive Dadson