¿Array de puntero de doble objeto como argumento de función?
Me surge una pregunta algo peculiar. Estaba haciendo un ejercicio y me encontré con un problema. El objetivo era crear una clase Empleado y luego una función que tuviera un array de Employee** y su tamaño como argumento, y que mostrara todos los empleados con más de 5 años de experiencia.
Aquí tienes las partes relevantes de la clase Empleado:
//en Employee.h:
int Getexperience() { return experience; }
virtual void show();
//en Employee.cpp:
void Employee::show()
{
cout << "Nombre: " << this->surname << ", Edad: " << this->age << ", Experiencia: " << this->experience << ", Salario: " << this->salary << endl;
}
Y aquí está la función, escrita en main.cpp:
void whoWorkMoreThan5Years(Employee** tab[], int size){
for(int i =0; i<size; i++){="" if(tab[i]-="">Getexperience() > 5){
tab[i]->show();
}
}
}
Esto me devuelve el siguiente error:
error: solicitud de miembro 'Getexperience' en '*(tab + ((sizetype)(((unsigned int)i) * 4u)))', que es de tipo puntero 'Employee*' (tal vez quisiste usar '->'?)
Y honestamente no tengo ni idea de lo que supuestamente significa, ya que:
- Estoy utilizando ‘->’ para el método del objeto.
- No sé a qué se refiere la parte ‘* *(tab + ((sizetype)(((unsigned int)i) * 4u)))’.
Supongo que mi pregunta básicamente es: ¿qué estoy haciendo mal aquí? ¿Hay alguna forma especial de utilizar los métodos de un objeto en esta situación que desconozco?</size;>
davy.ai
El mensaje de error indica que el compilador está tratando de acceder al método “Getexperience” en un puntero a un objeto “Employee”, lo cual no es posible.
Al observar el parámetro de la función, “Employee** tab[]” es un arreglo de punteros a punteros de objetos “Employee”. Por lo tanto, al acceder a un elemento del arreglo, primero necesitas desreferenciar el puntero para obtener un puntero a un objeto “Employee”, y luego desreferenciar nuevamente ese puntero para obtener el objeto real.
Aquí tienes una versión corregida de la función:
c++
void whoWorkMoreThan5Years(Employee** tab, int size){
for(int i = 0; i < size; i++){
if((*tab[i])->Getexperience() > 5){
(*tab[i])->show();
}
}
}
Observa que he eliminado el conjunto adicional de corchetes cuadrados en la declaración del parámetro, ya que no son necesarios.
En el bucle, primero desreferenciamos “tab[i]” con un conjunto de corchetes, obteniendo un puntero a un objeto “Employee”. Luego, desreferenciamos ese puntero con otro conjunto de corchetes para acceder al objeto real. Finalmente, podemos llamar a los métodos “Getexperience” y “show” en ese objeto utilizando el operador “->”.