2011-10-03 47 views
5

Cách viết hàm tạo bản sao cho một lớp mẫu. Vì vậy, nếu tham số mẫu là một lớp do người dùng định nghĩa khác thì hàm tạo bản sao của nó cũng được gọi.Cách viết hàm tạo bản sao lớp mẫu

Sau đây là lớp học của tôi

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

Bạn có muốn có trình tạo bản sao có thể chấp nhận bất kỳ 'lớp' nào làm đối số không? – iammilind

+2

@iammilind: Đó không phải là một nhà xây dựng bản sao. –

Trả lời

3

Giả sử _TyV là một loại giá trị:

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

Không phải những cái tên trong trường hợp lớp bảo vệ bởi việc thực hiện, bằng cách này?

Tiêu chuẩn C++ đặt một bộ tên để sử dụng bằng cách thực hiện C++ và thư viện chuẩn [C++ standard 17.6.3.3 - Reserved name]. Những nội dung đó bao gồm nhưng không giới hạn ở:

  • Tên có chứa dấu gạch dưới kép.
  • Tên bắt đầu bằng dấu gạch dưới theo sau là chữ hoa.
  • Tên bắt đầu bằng dấu gạch dưới tại không gian tên chung.
+0

Cảm ơn bạn sẽ khắc phục sự cố này. – Avinash

+0

điều gì xảy ra nếu _TyV là con trỏ hoặc tham chiếu – Avinash

+0

@Avinash: Nó cũng hoạt động tốt, tôi không biết tại sao tôi lại viết nó. Sẽ sửa chữa. –

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

Nhưng tôi không nghĩ rằng bạn cần phải xác định một cách rõ ràng sao chép constructor, trừ khi lớp có con trỏ dữ liệu thành viên và bạn muốn chắc sâu, bản sao của các đối tượng. Nếu bạn không có con trỏ dữ liệu thành viên, thì trình tạo bản sao mặc định do trình biên dịch tạo ra sẽ là đủ.

+0

Tôi không biết lớp học sẽ được sử dụng như thế nào. Tôi muốn làm cho nó chung chung. – Avinash

4

Hoặc a) không phải ở tất cả, chỉ cần dựa vào mặc định trình biên dịch cung cấp; hoặc b) bằng cách chỉ cần gọi các nhà xây dựng bản sao của thành viên:

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

Vấn đề là tất nhiên rằng các nhà xây dựng bản sao mặc định trình biên dịch cung cấp không chính xác cùng một điều: nó gọi các nhà xây dựng bản sao của mỗi thành viên từng người một . Vì vậy, đối với một lớp bao gồm các đối tượng thành viên thông minh, hàm tạo bản sao mặc định phải là tốt nhất có thể.

+0

Sau khi nhìn thấy câu trả lời của bạn, tôi hiểu câu hỏi. :) – iammilind

+0

Bạn cũng có thể mặc định rõ ràng hàm tạo bản sao trong C++ 0x. Ngoài ra, điều này đặt yêu cầu 'CopyConstructible' vào đối số mẫu của bạn. – pmr

Các vấn đề liên quan