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.

Cómo usar ‘mutable’ correctamente para que el iterador del conjunto no sea constante.

Estoy tratando de eliminar al empleado en mi código y cambiar su salario a 0, pero lo único que obtengo en la función es su ID. Utilicé el iterador incorporado para el conjunto, pero descubrí que es constante. ¿Cómo puedo usar ‘mutable’, u otra forma, para cambiar su salario a 0?
Tengo un empleado y un gerente: el gerente puede contratar o despedir al empleado, lo que cambiará su salario (obviamente).
Este es mi código:

class Manager : public Citizen {
protected:
    int salary;
    std::set<employee> employees;

void removeEmployee(const int id) {
    std::set<employee>::iterator employee;

    for (employee = this->employees.begin(); employee != this->employees.end(); employee++) {
        if (employee->getId() == id) {
            employee->setSalary(0);
            this->employees.erase(employee);
            return;
        }
    }
    throw EmployeeNotHired();
}

Y el error que estoy obteniendo:

C:\Users\User\CLionProjects\hw2Cpp\Manager.h:53:50: error: no se puede declarar 'employee' como 'mutable'
     mutable std::set<employee>::iterator employee;
                                                  ^~~~~~~~
C:\Users\User\CLionProjects\hw2Cpp\Manager.h:57:42: error: pasar 'const mtm::Employee' como argumento 'this' descarta cualificadores [-fpermissive]
                 employee->setSalary(0);

¿Qué debo hacer?

  • Editar *
    Intenté cambiarlo a:
class Employee : public Citizen {
protected:
    mutable int salary;
    mutable int score;
    std::set<skill> skills;

Pero aún no puedo cambiar el salario a 0.

error: pasar 'const mtm::Employee' como argumento 'this' descarta cualificadores [-fpermissive]
employee->setSalary(0);

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema radica en la constancia de los objetos Employee en el conjunto. Dado que el iterador es de un conjunto constante, no se pueden modificar los valores de los objetos Employee utilizando el iterador.

    Para resolver este problema, puedes utilizar un iterador mutable en lugar de un objeto Employee mutable. Esto significa que el iterador en sí mismo puede modificarse incluso si apunta a un conjunto constante. Aquí tienes una versión actualizada de tu código:

    void removeEmployee(const int id) {
        auto employee = std::find_if(employees.begin(), employees.end(),
            [id](const Employee& e) { return e.getId() == id; });
    
        if (employee != employees.end()) {
            employee->setSalary(0);
            employees.erase(employee);
        } else {
            throw EmployeeNotHired();
        }
    }
    

    En esta versión, utilizamos std::find_if con una función lambda para encontrar el objeto Employee con el id dado. Esto devuelve un iterador al objeto, que luego podemos utilizar para modificar el salario y eliminar el objeto del conjunto. Dado que el iterador no es constante, podemos modificar el objeto a través de él.

    Ten en cuenta que no es necesario declarar el iterador como mutable, ya que ya es no constante.

Comments are closed.