2010-09-10 23 views
6

Ho una struttura:Come posso assegnare un valore predefinito a una struttura in una funzione C++?

typedef struct { 
    double x,y,z; 
} XYZ; 

voglio definire una funzione come questa:

double CalcDisparity(XYZ objposition, 
        XYZ eyeposition, 
        double InterOccularDistance = 65.0) 

Ma io non riesco a trovare un modo per assegnare un valore predefinito per eyeposition. Come posso farlo in C++?

+0

è questo diritto C o C++? – diverscuba23

+3

@drknexus, una struttura in C++ è esattamente la stessa di una classe, tranne per il fatto che i membri sono pubblici per impostazione predefinita mentre i membri di una classe sono privati ​​per impostazione predefinita. Questo è tutto. Le strutture possono avere costruttori, distruttori, metodi, praticamente tutto ciò che una classe ha. Ora, se stai parlando di C, sono di nuovo diversi, quindi devi essere chiaro su quale lingua stai parlando di – Glen

+0

È C++, quindi ho modificato la domanda e i tag per rimuovere C dalla domanda. –

risposta

11

E '

struct XYZ{ 
    XYZ(double _x, double _y, double _z) : x(_x), y(_y),z(_z){} 
    XYZ() : x(0.0), y(42.0), z(0.0){} 

    double x, y, z; 
}; 

in modo che ora ho un costruttore di default. Poi si chiama in questo modo:

double CalcDisparity(XYZ objposition = XYZ(), 
         XYZ eyeposition = XYZ(), 
         double interOccularDistance = 65.0) 

Ma c'è un piccolo trucco: non si può fare un valore predefinito per il 1 ° e 3 ° solo argomenti. Un'altra cosa: C è un linguaggio, il C++ è un'altra lingua.

+0

È possibile se si definiscono costruttori aggiuntivi, ad es .: 'struct XYZ {XYZ (double _x, double _z): x (_x), y (42.0), z (_z)}; double CalcDisparity (XYZ objposition = XYZ(), eyeposition XYZ = XYZ (1.0, 2.0), double interOccularDistance = 65.0); ' –

1
  1. È possibile scrivere una funzione di fabbrica per la creazione di oggetti XYZ e chiamare la funzione come valore predefinito.

  2. È possibile rendere NULL il valore predefinito e quindi archiviare la funzione se l'argomento è NULL, creando un XYZ predefinito, se lo è.

  3. Creare un oggetto XYZ globale e assegnarlo come predefinito.

  4. Se non ti interessa usare C++ anziché C pura, fai di XYZ una classe con un costruttore.

Questi sono tutti i modi che verranno compilati e funzionanti, ma alcuni potrebbero non essere buone pratiche di codifica.

+0

se sta usando C++ allora può lasciarlo come struct, ma dargli un costruttore – Glen

2

In C, gli argomenti delle funzioni non possono avere valori predefiniti (non so su C++).

Ciò che è possibile fare, in C, è passare un valore (in qualche modo) non valido, controllare quel valore non valido e utilizzarne un altro.

int foo(int n) { 
    if (n == -1) { /* -1 is invalid */ 
    n = 42;  /* use 42 instead */ 
    } 
    /* ... */ 
} 
+0

Quando questa risposta è stato dato, la domanda è stata contrassegnata come 'C'; il tag è stato rimosso poiché C non supporta i valori predefiniti per gli argomenti. –

+0

C++ supporta i valori predefiniti. – andand

-1

È possibile combinare l'ultima soluzione con una parte della mia soluzione. Implementa un contatore di istanze. Se questo contatore è 0, si inizializza il valore. Ma il contatore non raggiunge mai altro che 0 ...

Forse aiuta.

Problemi correlati