Pregunta

Estoy mirando a través de una API escrita en C ++ y estoy confundido en cuanto a lo que significa el siguiente tipo de parámetro:

void*& data

¿Eso significa que el usuario pasaría en una referencia a un puntero vacío? Si eso es cierto, ¿cuál es el punto? Quiero decir que el vacío* ya está indirigido, entonces, ¿por qué querrías redirigirlo de nuevo?

¿Fue útil?

Solución

Es difícil de decir sin ver que se usa, pero usted señala que una referencia es un nivel de indirección. ¿Lo encontraría extraño si fuera un puntero a un puntero? Esos son bastante comunes: de hecho, tratas con ellos al aceptar argumentos de la línea de comandos y obtener punteros a los punteros de Char. Otro ejemplo sería si estuviera haciendo un mapa hash usando cubos, y quisiera poder devolver el puntero al puntero que inició el cubo.

El punto es que a veces necesita múltiples niveles de indirección. Es cierto que mezclar punteros y referencias puede ser peculiar, pero hay buenas razones para ello. Una razón común es la necesidad de que el código C ++ interactúe con las API C. Muchas llamadas del sistema POSIX requieren punteros vacíos que se pasan y luego cambian, por lo que la función C ++ en cuestión puede estar actuando como un envoltorio alrededor de eso.

Otros consejos

void * significa pasar por punto en C ++, lo que significa que pasa en un puntero, pero en realidad es una copia del puntero. Si modificó este puntero en su función, como cambiar su dirección, no se refleja en el puntero en el que pasó.

Combinando eso con pase por referencia, void *& significa que está pasando un alias del puntero original a esta función. Si lo modificó, como cambiar su dirección, se reflejará en el puntero original.

Pero tenga cuidado de no devolver la referencia al vacío local*. No hagas algo como esto:

void*& f()
{
 int* a=new int(10);
 void* x=(void*)a;
 return x;
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top