C++/argumentos en h. Archivo

Leí un libro, que da un ejemplo de archivo .h, que es igual a la interfaz de la cola en Java:

void InitQueue(Queue* pQueue, int iSize);
bool Insert(Queue* pQueue, const Item* pItem);
bool Extract(Queue* pQueue, Item** pItem);
bool GetFirst(const Queue* pQueue, Item** pItem);
bool IsFull(const Queue* pQueue);
bool IsEmpty(const Queue* pQueue);

No entendí dos cosas:

  1. Por qué en Extract, GetFirst El segundo argumento es de tipo Item** y no Item*? ¿Qué significa cuando escribimos tal cosa?
  2. Por qué en algunas funciones (IsFull, IsEmpty, ..) obtenemos como argumento const Queue* y no simplemente Queue*?

preguntado el 03 de mayo de 12 a las 16:05

¿El libro fue escrito por un programador de 2 estrellas? -

¿Es esto realmente C++? Parece el tipo de cosa que se hace en C. (Por otra parte, tal vez esta sea una técnica que no conozco) -

Porque quieren poder cambiar el puntero que pasas a la función. si fuera solo Item * pItem, estaría pasando una copia de su puntero, que si lo cambian dentro de la función, no sería visible fuera de la función:

Además, ¿qué libro es este? -

@Pubby No encuentras bool o const en C (ok, obtienes stdbool en C99) es solo C++ antiguo :-) -

3 Respuestas

IsFull() e IsEmpty() toman argumentos constantes porque implica que no cambiarán el objeto Queue; es constante y no se modificará.

Extraiga y use GetFirst ** debido a esto:

int a;           // Declares an int
a = 2;           // Sets a to 2
int *b = &a;     // Declares a pointer pointing to that int
*b = 4;          // Sets a to 4
int **c = &b;    // Declares a pointer pointing to that pointer to that int
**c = 6;         // Sets a to 6

Si tuviera que pasar c a una función:

int global_var;

int main() {
  modify_ptr(c);
}

void modify_ptr(int **ptr)
{
  *ptr = &global_var;
}

El puntero que acabo de pasar fue modificado; **c ahora apunta a global_var en lugar de a.

La razón por la que pasa estos punteros a getfirst y extract es porque esas son funciones de "obtención": desea que devuelvan un puntero a los datos. Por lo tanto, deben poder devolver un puntero, y el método que emplean es pasar un puntero a otro puntero, como en el ejemplo anterior, para que puedan modificar lo que les pasa para que apunte al elemento correcto.

contestado el 03 de mayo de 12 a las 16:05

Por qué en Extract, GetFirst El segundo argumento es de tipo Item** y no Item*? ¿Qué significa cuando escribimos tal cosa?

Para que el puntero se pueda cambiar dentro de la función.
Lo más probable es que signifique que el Item La persona que llama pasará el puntero, pero se asignará dentro de la función. No puede hacerlo simplemente pasando un puntero por valor porque eso asignaría memoria a una copia del puntero y no al puntero original que se pasa.

Es difícil decir por qué el programador usa esta semántica de que la persona que llama pasa el puntero y la función lo asigna. Idealmente, uno esperaría un mecanismo de fuente-sumidero.

Por qué en algunas funciones (IsFull, IsEmpty, ..) obtenemos como argumento const Queue* y no simplemente Queue*?

Para const corrección!
Indica al usuario de la función que los datos apuntados no serán cambiados dentro de la función.

contestado el 04 de mayo de 12 a las 03:05

¿Por qué en Extract, GetFirst El segundo argumento es de tipo Item** y no Item*? ¿Qué significa cuando escribimos tal cosa?

Esas son las salidas. La cola aparentemente comprende un montón de punteros a elementos. Como es un puntero, habría hecho Extract y GetFirst toma solo un argumento y devuelve un puntero. Un puntero nulo indicaría un error. Los desarrolladores no lo hicieron de esta manera. En su lugar, utilizaron un viejo paradigma de estilo C. ¿Por qué? Quién sabe. Esta no es la mejor manera de escribir esto.

¿Por qué en algunas funciones (IsFull, IsEmpty, ..) obtenemos como argumento const Queue* y no simplemente Queue*?

Marcar el argumento como const le dice al usuario del código que la función no hará nada con el contenido del argumento. Marcar argumentos de puntero y referencia no perturbados como const es una buena práctica de programación.

contestado el 03 de mayo de 12 a las 16:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.