2011-10-03 17 views
5

Cómo escribir el constructor de copia para una clase de plantilla. De modo que si el parámetro de plantilla es otra clase definida por el usuario, también se llamará al constructor de copia.Cómo escribir el constructor de copia de clase de plantilla

que sigue es mi clase

template <typename _TyV> 
class Vertex { 
public: 
    Vertex(_TyV in) : m_Label(in){ } 
    ~Vertex() { } 
    bool operator < (const Vertex & right) const { 
     return m_Label < right.m_Label; 
    } 

    bool operator == (const Vertex & right) const { 
     return m_Label == right.m_Label; 
    } 

    friend std::ostream& operator << (std::ostream& os, const Vertex& vertex) { 
     return os << vertex.m_Label;  
    } 

    _TyV getLabel() { return m_Label;} 
private: 
    _TyV m_Label; 
public: 
    VertexColor m_Color; 
protected: 
}; 
+0

¿Desea tener un constructor de copia que pueda aceptar cualquier 'clase' como argumento? – iammilind

+2

@iammilind: Eso no sería un constructor de copias. –

Respuesta

3

Suponiendo _TyV es un tipo de valor:

Vertex(Vertex const& src) 
    : m_Label(src.m_Label) 
{} 

no son los nombres dentro de instancias de clases reservadas por la aplicación, por cierto?

El estándar C++ reserva un conjunto de nombres para su uso por la implementación de C++ y las bibliotecas estándar [C++ estándar 17.6.3.3 - Nombres reservados]. Estos incluyen pero no están limitados a:

  • Nombres que contienen un doble guión bajo.
  • Nombres que comienzan con un guión bajo seguido de una letra mayúscula.
  • Nombres que comienzan con un guión bajo en el espacio de nombres global.
+0

Gracias arreglarán esto. – Avinash

+0

¿Qué pasa si el _TyV es puntero o referencia – Avinash

+0

@Avinash: Funcionaría igual de bien, no sé por qué escribí eso. Arreglará. –

2
template <typename T> 
class Vertex { 
public: 

    //this is copy-constructor 
    Vertex(const Vertex<T> &other) 
      : m_Color(other.m_Color),m_Label(other.m_Label) 
    { 
     //.. 
    } 
    //.. 
}; 

Pero no creo que tenga que definir explícitamente el constructor de copia, a menos que la clase tiene puntero datos de los miembros y que desea hacer profundas copia de los objetos. Si no tiene puntero datos de miembro, entonces el constructor de copia predeterminado generado por el compilador sería suficiente.

+0

No sé cómo se usará la clase. Quiero hacerlo genérico. – Avinash

4

o bien a) no es en absoluto, sólo se basan en el valor por defecto el compilador proporcionado; o b) con sólo invocar el constructor de copia del miembro:

template <typename T> struct Foo 
{ 
    T var; 
    Foo(const Foo & rhs) : var(rhs.var) { } 
}; 

El punto es, por supuesto, que la copia por omisión constructor compilador proporcionado hace exactamente lo mismo: se invoca el constructor copia de cada miembro de uno a uno . Entonces, para una clase que está compuesta de objetos miembros inteligentes, el constructor de copia predeterminado debe ser el mejor posible.

+0

Después de ver tu respuesta, entendí la pregunta. :) – iammilind

+0

También puede establecer explícitamente el constructor de copia en C++ 0x. También esto coloca el requisito 'CopyConstructible' en su argumento de plantilla. – pmr

Cuestiones relacionadas