2011-10-03 24 views
5

Şablon sınıfı için kopya oluşturucu nasıl yazılır. Böylece şablon parametresi başka bir kullanıcı tanımlı sınıfsa, kopya kurucusu da çağrılır. TakipŞablon sınıfı kopya oluşturucu nasıl yazılır

benim sınıf

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

Herhangi bir argüman olarak 'class' kabul edebilecek kopya kurucusuna sahip olmak ister misiniz? – iammilind

+2

@iammilind: Bu bir kopya kurucusu olamaz. –

cevap

3

_TyV bir değer türü olduğunu varsayarsak?

C++ standardı, C++ uygulaması ve standart kitaplıklarda kullanılmak üzere bir dizi isim saklar [C++ standart 17.6.3.3 - Ayrılmış adlar]. Bunlar aşağıdakileri içerir ancak bunlarla sınırlı değildir:

  • Çift alt çizgi içeren isimler.
  • Altyazıyla başlayan ve ardından büyük harfle başlayan isimler.
  • Genel ad alanında alt çizgi ile başlayan adlar.
+0

Teşekkürler bunu düzeltir. – Avinash

+0

_TyV, işaretçi veya referans – Avinash

+0

@Avinash: Ya da iyi çalışırdı, neden yazdığını bilmiyorum. Düzeltecek. –

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) 
    { 
     //.. 
    } 
    //.. 
}; 

olduğu Ama sınıf işaretçi üye veri olmadığı sürece, açıkça kopya-kurucusu tanımlamak için gerek olduğunu sanmıyorum ve derin-yapmak istiyorum nesnelerin kopyası. işaretçi üye verisi yoksa, derleyici tarafından oluşturulan varsayılan kopya yapıcı yeterli olur. Bu arada, uygulama tarafından ayrılmış sınıf örneklerini içinde bu isimleri değil misin

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

:

+0

Sınıfın nasıl kullanılacağını bilmiyorum. Ben jenerik yapmak istiyorum. – Avinash

4

Ya a) Hiç, sadece derleyici tarafından sağlanan varsayılan dayanmaz; veya b) sadece üyesinin kopya kurucu çağırarak: o tek her üyenin bir kopyası kurucuya başvuran:

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

noktası derleyici tarafından sağlanan varsayılan kopya yapıcı şekilde bir inceleme yapar aynı şey elbette . Bu nedenle, akıllı üye nesnelerden oluşan bir sınıf için, varsayılan kopya kurucusu mümkün olan en iyi şekilde olmalıdır.

+0

Cevabınızı gördükten sonra, sorumu anladım. :) – iammilind

+0

Ayrıca kopya kurucuyu C++ 0x'de açıkça varsayılan olarak da önleyebilirsiniz. Ayrıca bu, şablon argümanınızda 'CopyConstructible' gereksinimini de gösterir. – pmr

İlgili konular