es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿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:

  1. Estoy utilizando ‘->’ para el método del objeto.
  2. 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;>

Tags:  , ,

Answer

  1. Avatar for 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 “->”.

Comments are closed.