Domanda

Sto scrivendo una lezione e questo dubbio è emerso. È questo undef. comportamento? D'altra parte, non sono sicuro che sia consigliato o se è una buona pratica. È uno se non mi assicuro che non vengano lanciate eccezioni nella funzione 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;
}

Grazie in anticipo

È stato utile?

Soluzione

Va tutto bene. Una volta entrati nel corpo del costruttore, tutti i membri sono stati inizializzati e sono pronti per l'uso. (Il corpo deve quindi completare qualsiasi altro lavoro che deve essere fatto per creare un oggetto completamente costruito.)

Ma è uno stile scadente. Meglio è solo:

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

E elimina tutto il casino.


Le eccezioni non hanno nulla a che fare con la sicurezza, i costruttori sono liberi di lanciare. In effetti, se non riesci a costruire con successo un oggetto, lanciare un'eccezione è la linea di azione preferita.

Altri suggerimenti

Quando il controllo raggiunge il costruttore, tutte le variabili avrebbero avuto valori predefiniti.

Posso pensare a un caso specifico in cui questo potrebbe morderti. Se C intende essere una classe base, consentire a un riferimento di fuggire alle funzioni non membri può causare sorpresa. Nella classe di base i costruttori sono più speciali perché la classe derivata non è stata ancora costruita e le funzioni virtuali chiamano la classe base piuttosto che la classe derivata. Le funzioni non membri potrebbero non aspettarsi di ottenere un oggetto in questo stato e, poiché non sembrano costruttori, sarebbe facile introdurre bug dimenticandolo.

Tuttavia, non è ancora un comportamento indefinito - solo un comportamento definito sorprendente :)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top