2010-09-19 8 views
1

Les gars, je suis très nouveau en C++. Je viens écrit cette classe:C++ passer par pointeur

class planet 
{ 
public: 
float angularSpeed; 
float angle; 
}; 

est ici une fonction essayer de modifier l'angle de l'objet:

void foo(planet* p) 
{ 
    p->angle = p->angle + p->angularSpeed; 
} 

planet* bar = new planet(); 
bar->angularSpeed = 1; 
bar->angle = 2; 
foo(bar); 

Il semble que l'angle dans la barre n'a pas changé du tout.

+1

Êtes-vous sûr? (indice de conseil) – sellibitze

+0

Vous le passez par le pointeur; pas de référence. Et ça devrait marcher. –

+0

pouvez-vous montrer un peu plus de votre code? comment allez-vous examiner bar après? – SingleNegationElimination

Répondre

4

Notez que vous transmettez bar par pointeur, et non par référence. Passer par référence ressemblerait à ceci:

void foo(planet& p) // note: & instead of * 
{ 
    p.angle += p.angularSpeed; // note: . instead of -> 
} 

passe par référence a l'avantage supplémentaire que p ne peut pas être une référence nulle. Par conséquent, votre fonction ne peut plus provoquer d'erreur de déréférencement null. Deuxièmement, et c'est un détail, si votre planet ne contient que des variables membres publiques, vous pouvez tout aussi bien le déclarer struct (où l'accessibilité par défaut est public). PS: Autant que je peux le voir, votre code devrait travail; au moins les parties que vous nous avez montrées.

+0

Ce n'est pas comme ça que vous faites une référence en C++ standard. Eh bien, après votre édition de ninja, c'est. –

+0

@Ben - quelle est l'erreur ici? TIA –

+0

Au moment de mon commentaire, votre code était 'void foo (planet% p)'. Votre version ninja-d est correcte. –

3

Les apparences doivent être trompeuses car le code doit entraîner la modification du contenu du champ angle.

btw cela ne passe pas par référence, cela passe par pointeur. Pourriez-vous changer le titre?

passage par référence (mieux) serait

void foo(planet& p) { 
p.angle += p.angularSpeed; 
} 

planet bar; 
bar.angularSpeed=1; 
bar.angle=2; 
foo(bar); 

Vous pouvez également envisager un constructeur pour planet qui prend comme paramètres les valeurs initiales de angle et angularSpeed et définir un constructeur par défaut qui les définit à la fois à 0 Sinon, vous avez une batterie de bogues en préparation en raison de valeurs non définies dans les instances planet.

Questions connexes