confronto delle variabili senza inizializzazione

4

Sto lavorando con un progetto in VC ++ che coinvolge il sistema di coordinate con asse x, y, z.
Sto cercando di verificare se una variabile (Punto con valori x, y, z) è assegnata al sistema di coordinate o è un punto predefinito (non inizializzato).
Poiché un sistema di coordinate non è in grado di assegnare un valore predefinito alla variabile in modo che sia negativo o positivo o pari a zero poiché tutti questi sono valori validi.

Il mio approccio qui è di avere una variabile booleana associata alla mia variabile variabile . Se il booleano è impostato, il punto non è assegnato. Ora devo controllare ogni singola dichiarazione in cui è possibile assegnare il valore e impostare Boolean.

Ora ho provato con questo approccio che è piuttosto brutto e potresti considerarlo sbagliato. Quello che sto facendo qui è prendere una variabile float non inizializzata (poiché i membri x, y, z di Point sono float) e confrontarla con i membri x, y, z della variabile Point.
Poiché nel caso in cui Point non è inizializzato, sia la variabile float che i membri di Point corrispondono e io posso dichiararne la non inizializzata. Ho provato a testarlo su diversi compilatori e ottengo il risultato come previsto.
Ovvio, ricevo un avviso del compilatore per variabile non inizializzata utilizzata per il confronto

La mia domanda, il secondo approccio è davvero pessimo o ci sono soluzioni alternative su questo.

    
posta Shirish11 05.05.2012 - 09:39
fonte

5 risposte

5

Perché non usare boost :: opzionale o simile?

boost::optional<point> point;

if(point)
    //is init.

Potresti creare la tua classe template, ma avere un bool flag separato non è molto buono, dal momento che ingombrare lo spazio dei nomi in ogni punto in cui vuoi un punto "nullable". Inoltre, non è semanticamente ovvio che il punto e il bool siano raggruppati / appartengano - specialmente se più persone visualizzano il codice in diversi punti di sviluppo ecc.

Metterlo nella classe di punti non è al 100% semanticamente corretto imo - è meglio usare la composizione per rappresentare questo genere di cose, poiché un punto è un punto. Se lo stratifichiamo con un 'titolare' basato su modelli che raggruppa il bool insieme a quello è ovvio che cosa succede - e in altri punti in cui hai semplicemente bisogno di un punto, usi il punto così com'è.

    
risposta data 06.05.2012 - 13:08
fonte
4

Una variabile non inizializzata sempre ha un valore - non sarà semplicemente un valore che ti è utile, ma sarà un valore che è rimasto in memoria dall'ultima volta quel particolare pezzo di memoria era stato usato. Il compilatore ti avverte che l'effetto dell'uso di una variabile non inizializzata in un confronto sarà un comportamento indefinito e imprevedibile.

se gli oggetti Point devono essere in grado di rappresentare uno stato interno che indica se le coordinate sono valide, la tua prima idea di aggiungere un bool nella tua classe Point sarebbe una soluzione più affidabile. Avrai bisogno di controllare qualcosa quindi perché non vuoi aggiungere un bool? Dare alla tua classe Point uno stato interno ti consente anche di convalidare internamente lo stato, che potrebbe essere ottenuto con un getter di stato o un'eccezione.

    
risposta data 05.05.2012 - 10:04
fonte
4

Invece di usare le coordinate non inizializzate, puoi inizializzarle su NaN (vedi qui ) se il tuo il compilatore lo supporta.

Quindi sei sempre sicuro che un punto sia indefinito o rappresenti un punto reale nello spazio tridimensionale.

    
risposta data 05.05.2012 - 10:07
fonte
2

C'è qualcosa che ti impedisce di richiedere le coordinate durante l'inizializzazione di Point ? La classe potrebbe essere simile a:

class Point {
public:
    Point( float x, float y, float z )
        : _x( x ), _y( y ), _z( z ) {}

    // Getters/setters as needed    

private:
    float _x, _y, _z;
}

A questo punto, non c'è modo di creare l'oggetto senza avere un valore iniziale, che è presumibilmente valido.

Con questo approccio, se hai bisogno di variabili non inizializzate di Point da qualche parte, dovrai usare i puntatori. Se segui la pratica comune di inizializzare i puntatori a NULL (o nullptr ), ogni volta che hai un puntatore valido su Point , hai un set valido di coordinate.

    
risposta data 06.05.2012 - 22:48
fonte
1

Considero il tuo secondo approccio davvero pessimo.

Innanzitutto, considera se è possibile modificare il progetto per rendere possibile l'istanziazione dell'oggetto Point solo quando sono disponibili valori validi per le coordinate x, y, z. Fornisci solo un costruttore che prende tutti e 3 i parametri.

In secondo luogo, considera un unico metodo per impostare le coordinate:

void setCoordinates(float x, float y, float z)

In questo metodo, imposta la variabile di stato che stai usando per contrassegnare i valori validi.

    
risposta data 05.05.2012 - 21:15
fonte

Leggi altre domande sui tag