2011-08-04 14 views
5

¿Es posible "agregar" al constructor de copia predeterminado?¿Es posible "agregar" al constructor de copia predeterminado?

Por ejemplo. Para esta clase:

class A 
{ 
    public: 
     int a; 
     int* b; 
}; 

Quiero acaba de escribir

A::A(const A& rvalue): 
    a(rvalue.a), 
    b(new int(*(rvalue.b))) 
{} 

sin la parte a(rvalue.a).

(Ignorar el mal código/feo y posibles pérdidas de memoria)

+0

este constructor de copia por defecto no es trivial – Benoit

+0

¿Por qué necesita esto? ¿No puedes cambiar la clase? –

+1

Es solo que tengo una clase bastante grande con solo un puntero (y no puedo usar punteros inteligentes), así que necesito escribir un constructor de copia para él, pero la mayoría del constructor de copia estaría haciendo lo que el constructor de copia predeterminado habría hecho –

Respuesta

8

lo que pide es imposible. Una vez que declare su propio constructor de copia, el compilador no generará un constructor de copia para usted. Eso significa que no podrá simplemente agregar o aumentar el constructor de copia predeterminado porque no existirá. Es todo o nada, por así decirlo.

+0

Tenga en cuenta que esta es otra razón más para evitar hacer cosas (es decir, punteros desnudos) que requieren escribir un constructor de copia. No a menos que no tenga otra opción. –

5

es imposible. Sin embargo, si desea reducir código redundante para un gran número de campos "por defecto copiado", que se puede lograr con la herencia intermdiate:

struct A1 { 
    int a1; 
    int a2; 
    // .... 
    int aN; 
}; 

struct A:public A1 
{ 
    int* b; 
    A(const A& rhs): A1(rhs), b(new int(*(rhs.b))) {} 
}; 
1

Lo que quiere hacer no es compatible nartually por C++: no se puede tener medio constructor por defecto.

Pero lo que quiere lograr que se puede hacer por el pequeño truco a continuación:

tenga en cuenta esta pequeña demostración es un listado de defectos lote (pérdida de memoria, etc.), por lo que es sólo para demostración de la solución tentativa única:

//class A hasa large number date members(but all can take advantage of default 
//copy constructor 
struct A{ 
    A(int i):a(i){} 
    int a; 
    //much more data memberS can use default copy constructor all in class A 
}; 

//class B is simply wrapper for class A 
//so class B can use the default constructor of A 
//while just write copy constructor for a raw pointer in it's copy constructor 
//I think this is what OP want ? 
struct B 
{ 
    B(int i,int j):m_a(i),m_b(new int(j)){} 

    B(const B & rval): 
    m_a(rval.m_a), 
    m_b(new int(*rval.m_b)) 
    { 
    } 
    A  m_a; 
    int * m_b; 
}; 

int main() 
{ 
    B c(2,3); // a=2, *m_b=3 
    B d(c); //after copy constructor, a=2, *m_b=3 
} 
+0

Creo que esto ya ha sido mencionado por user396672 –

+0

No sabía porque solo leí su pregunta y tomé esta solución yo mismo ... – Gob00st

Cuestiones relacionadas