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.

Redefinir operator= en Cpp/C++.

Tengo una clase foo con un int ID único y un string name. El ID se asigna automáticamente en la construcción y el nombre es un argumento del constructor. El constructor de copia está =borrado.

Ahora necesito reasignar el operador= para que:


foo f1("Name1");
foo f2 = f1;

equivalga a

f2.ID =/= f1.ID

pero

f2.Name = f1.Name

Esta es la clase:

“`

#include <iostream>

class foo
{
private:
static int MaxID;
int ID;
string Name;

public:
foo(string l<em>Name):Name(l</em>Name),ID(MaxID) {MaxID++}
foo(foo&) = delete;

<pre><code>getName() { return Name; };
setName(string TempName) { Name = TempName; };
</code></pre>

};

<code>
Esto es lo mejor que puedo pensar

</code>

foo& operator=(foo& right)
{
this.setName(right.getName);
return *this;
};

“`

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para reasignar operator= de la clase foo dada de tal manera que f2.ID =/= f1.ID pero f2.Name = f1.Name, necesitamos modificar la función del operador de asignación. Esto se puede lograr definiendo la función operator= dentro de la clase foo.

    La clase foo modificada con el código adecuado de sobrecarga de operator= se muestra a continuación:

    #include <iostream>
    
    class foo
    {
    private:
        static int MaxID;
        int ID;
        std::string Name;
    
    public:
        foo(std::string l_Name) : Name(l_Name), ID(MaxID++) {}
    
        // Constructor de copia
        foo(const foo& rhs) : ID(MaxID++), Name(rhs.Name) {}
    
        // Sobrecarga del operador de asignación
        foo& operator=(const foo& rhs) {
            Name = rhs.Name;
            return *this;
        }
    
        std::string getName() const { return Name; };
        void setName(std::string TempName) { Name = TempName; };
    };
    
    int foo::MaxID = 0;
    

    La función de sobrecarga de operator= copia solo el miembro Name del objeto foo dado. Esto se logra configurando el Name del objeto rhs con el Name del objeto this. El tipo de retorno de la función de operador de asignación es foo&, que devuelve el objeto modificado por referencia.

    Ahora, el siguiente fragmento de código tendrá el resultado que requerimos:

    foo f1("Name1");
    foo f2 = f1;
    std::cout << "f1: " << f1.getName() << " " << f1.getID() << std::endl;
    std::cout << "f2: " << f2.getName() << " " << f2.getID() << std::endl;
    

    Output:

    f1: Name1 0
    f2: Name1 1
    

    Aquí, podemos ver que el ID de f2 no es igual al ID de f1, pero sus valores de Name son los mismos. Esto se logra sobrecargando el operador de asignación en la clase foo dada.

Comments are closed.