Question

J'écris un cours, et ce doute est venu. Est-ce que c'est undef. comportement? D'un autre côté, je ne suis pas sûr que ce soit recommandé, ou si c'est une bonne pratique. Est-ce un si je m'assure aucune exception à lancer dans la fonction INIT?

//c.h
class C{

    float vx,vy;
    friend void init(C& c);
public:
    C();

};


//c.cpp
C::C()
{
   init(*this);
}

void init(C& c) //throws() to ensure no exceptions ?
{
  c.vx = 0;
  c.vy = 0;
}

Merci d'avance

Était-ce utile?

La solution

C'est tout à fait bien. Une fois que vous êtes entré dans le corps du constructeur, tous les membres ont été initialisés et ils sont prêts à l'emploi. (Le corps doit ensuite terminer tout travail qui doit être fait pour créer un objet entièrement construit.)

Mais c'est un style mauvais. Mieux est juste:

C::C() :
vx(), vy() // or vx(0), vy(0) if you prefer to be explicit
{}

Et supprimez tout le gâchis.


Les exceptions n'ont rien à voir avec la sécurité, les constructeurs sont libres de lancer. En fait, si vous ne pouvez pas construire avec succès un objet, lancer une exception est la ligne de conduite préférée.

Autres conseils

Au moment où le contrôle atteint le constructeur, toutes les variables auraient obtenu des valeurs par défaut.

Je peux penser à un cas spécifique où cela pourrait vous mordre. Si C est destiné à être une classe de base, permettant à une référence de s'échapper vers des fonctions non membres peut entraîner une surprise. Dans la classe de base, les constructeurs de cas sont plus spéciaux car la classe dérivée n'a pas encore été construite et les fonctions virtuelles appellent la classe de base plutôt que la classe dérivée. Les fonctions non membres peuvent ne pas s'attendre à obtenir un objet dans cet état, et parce qu'ils ne ressemblent pas à des constructeurs, il serait facile d'introduire des bogues en oubliant cela.

Ce n'est toujours pas un comportement indéfini - tout simplement un comportement défini surprenant :)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top