2010-09-10 19 views
6

que tienen una estructura:¿Cómo puedo asignar un valor predeterminado a una estructura en una función de C++?

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

quiero definir una función como esta:

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

Pero me parece que no puede encontrar una manera de asignar un valor predeterminado a eyeposition. ¿Cómo puedo hacer esto en C++?

+0

¿esta es C o C++? – diverscuba23

+3

@drknexus, una estructura en C++ es exactamente lo mismo que una clase, excepto que sus miembros son públicos por defecto, mientras que los miembros de una clase son privados por defecto. Eso es. Las estructuras pueden tener constructores, destructores, métodos, básicamente todo lo que tiene una clase. Ahora bien, si estás hablando de C, entonces son diferentes nuevamente, por lo que debes tener claro el idioma del que estás hablando – Glen

+0

Es C++, así que he editado la pregunta y las etiquetas para eliminar C de la pregunta. –

Respuesta

11

Es

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; 
}; 

por lo que ahora tengo un constructor por defecto. Posteriormente, se llama así:

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

Pero hay un pequeño truco: no se puede hacer un valor predeterminado para la primera y sólo 3er argumentos. Una cosa más: C es un lenguaje, C++ es otro idioma.

+0

Puede hacerlo si define constructores adicionales, por ejemplo: 'struct XYZ {XYZ (double _x, doble _z): x (_x), y (42.0), z (_z)}; doble CalcDisparity (XYZ objposition = XYZ(), XYZ eyeposition = XYZ (1.0, 2.0), double interOccularDistance = 65.0); ' –

1
  1. Puede escribir una función de fábrica para crear objetos XYZ y llamar a la función como el valor predeterminado.

  2. Puede hacer que NULL sea el valor predeterminado, y luego verificar en la función si el argumento es NULL, creando un XYZ predeterminado si lo es.

  3. Cree un objeto XYZ global y asígnelo como el predeterminado.

  4. Si no te importa usar C++ en lugar de C puro, haz de XYZ una clase con un constructor.

Esas son todas las formas que se compilarán y funcionarán, pero algunas podrían no ser buenas prácticas de codificación.

+0

si usa C++, entonces puede dejarlo como una estructura, pero le da un constructor – Glen

2

En C, los argumentos de la función no pueden tener valores predeterminados (no sé cuántos C++).

Lo que puede hacer, en C, es pasar un valor (de alguna manera) no válido, buscar ese valor no válido y usar otro en su lugar.

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

Cuando esta respuesta fue dado, la pregunta fue etiquetada 'C'; la etiqueta se eliminó porque C no admite valores predeterminados para los argumentos. –

+0

C++ admite valores predeterminados. – andand

-1

Puede combinar la última solución con una parte de mi solución. Implementa un contador de instancias. Si este contador es 0, usted inicializa el valor. Pero el contador nunca llega a nada más que 0 ...

Quizás esto ayude.

Cuestiones relacionadas