2009-02-17 11 views
5

Tengo una clase C++, digamos que se llama C, y quiero utilizar el constructor de copia implícita en uno de los métodos, de esta manera:El uso de "esto" como parámetro para copiar constructor

c c::do_something() { 
    c copy = this; //I want implicit copy constructor here! 
    copy.something_else(); 
    //........// 
    return copy; 
} 

sin embargo, los rendimientos de gcc este error:

error: invalid conversion from 'c* const' to 'long unsigned int'

(tengo otro constructor de largo sin signo int presente)

... como si no existiera el constructor de copia. ¿Qué estoy haciendo mal?

Respuesta

20

este es un puntero a un objeto lo que debe ser

c copy = *this; 
+0

bien ... sí, eso es, al parecer. gracias :) –

+0

Esto realmente está usando el constructor predeterminado y luego el operador de asignación, * no * el constructor de copia. Vea la respuesta de Matt. –

+0

Andrew: No estoy seguro - Josh a continuación (y algunos sitios) dice lo contrario –

4

Jo Jo! Además, no confunda el constructor de copia y el operador de asignación de copias.

c copy (*this); 

es el constructor de copias;

c copy = *this; 

es el operador de asignación de copias. Cualquiera de los dos funcionará, aunque el constructor de copias es técnicamente más eficiente, aunque el operador de asignación de copias a menudo está optimizado para hacer lo mismo.


Wow - Me encuentro corregir. Usar el operador = en la misma instrucción que la declaración de una variable llama al constructor de copia. ¡Tu aprendes algo nuevo cada dia!

+0

No - c copiar (* esto); es idéntico a c copy = * this; (siempre que * este sea del tipo c) ambos invocan el constructor de copia. c copia; copiar = * esto; invoca el constructor predeterminado y luego el operador de asignación. – Eclipse

+0

No es solo una cuestión de eficiencia ... el constructor de copias y el operador de asignación pueden tener funciones completamente diferentes. –

6

Dejando a un lado, pero no cabe realmente en un comentario y parece que hay algún desacuerdo. Pruebe esta pieza de código para tener una idea de cuándo se llaman los constructores de copia y operadores de asignación:

class A 
{ 
public: 
    A() { cout << "A::A()\n"; } 
    A(const A &) { cout << "A::A(const A &)\n"; } 
    void operator =(const A &) { cout << "A::operator=(const A &)\n"; } 
}; 

int main() 
{ 
    A a; // default constructor 
    A copy = a; // copy constructor (and no assignment operator) 
    A copy2(a); // copy constructor (and no assignment operator) 
    a = copy; // assignment operator 
    A function(); // declares a function return A 
    A b = A(); // default constructor (but no assignment operator) 
    A b2 = A(a); // copy constructor (but no assignment operator) 
} 
+0

Para completar, podría ser una idea agregar un constructor "A (int)" y luego mostrar que "A a = 10;" es equivalente a: "A a (A (10))". –

Cuestiones relacionadas