Después de leer sobre los constructores de copias y los operadores de asignación de copias en C++, traté de crear un ejemplo simple. Aunque aparentemente parece que el fragmento siguiente funciona, no estoy seguro de si estoy implementando el constructor de copias y el operador de asignación de copias de la manera correcta. ¿Podría señalar si hay errores/mejoras o un mejor ejemplo para comprender los conceptos relevantes?C++: implementar el constructor de copias y el operador de asignación de copias
class Foobase
{
int bInt;
public:
Foobase() {}
Foobase(int b) { bInt = b;}
int GetValue() { return bInt;}
int SetValue(const int& val) { bInt = val; }
};
class Foobar
{
int var;
Foobase *base;
public:
Foobar(){}
Foobar(int v)
{
var = v;
base = new Foobase(v * -1);
}
//Copy constructor
Foobar(const Foobar& foo)
{
var = foo.var;
base = new Foobase(foo.GetBaseValue());
}
//Copy assignemnt operator
Foobar& operator= (const Foobar& other)
{
if (this != &other) // prevent self-assignment
{
var = other.var;
base = new Foobase(other.GetBaseValue());
}
return *this;
}
~Foobar()
{
delete base;
}
void SetValue(int val)
{
var = val;
}
void SetBaseValue(const int& val)
{
base->SetValue(val);
}
int GetBaseValue() const
{
return(base->GetValue());
}
void Print()
{
cout<<"Foobar Value: "<<var<<endl;
cout<<"Foobase Value: "<<base->GetValue()<<endl;
}
};
int main()
{
Foobar f(10);
Foobar g(f); //calls copy constructor
Foobar h = f; //calls copy constructor
Foobar i;
i = f;
f.SetBaseValue(12);
f.SetValue(2);
Foobar j = f = z; //copy constructor for j but assignment operator for f
z.SetBaseValue(777);
z.SetValue(77);
return 1;
}
+1 buen punto, el idioma de copiar y cambiar es esencial para tener una implementación segura de excepción que garantice que el objeto permanezca en un estado consistente. – jdehaan
¿La memoria no será liberada por el destructor '~ Foobar()'? – blitzkriegz
@Mahatma: '~ Foobar()' no se invocará; el objeto nunca se destruye, se asigna a. –