2011-08-04 25 views
5

Có thể "thêm" vào hàm tạo bản sao mặc định không?Có thể "thêm" vào hàm tạo bản sao mặc định không?

Ví dụ: Cho lớp này:

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

Tôi muốn chỉ cần viết

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

mà không cần phần a(rvalue.a).

(Bỏ qua mã xấu/xấu và có thể rò rỉ bộ nhớ)

+0

Hàm tạo bản sao mặc định này không tầm thường – Benoit

+0

Tại sao bạn cần điều này? Bạn không thể thay đổi lớp học? –

+1

Chỉ là tôi có một lớp khá lớn chỉ với một con trỏ duy nhất (Và tôi không thể sử dụng con trỏ thông minh) vì vậy tôi cần viết một hàm tạo bản sao cho nó, nhưng hầu hết các hàm tạo bản sao sẽ chỉ làm những gì mà hàm tạo bản sao mặc định có thể đã thực hiện –

Trả lời

8

Điều bạn yêu cầu là không thể. Khi bạn khai báo hàm tạo bản sao của riêng bạn, trình biên dịch sẽ không tạo ra một hàm tạo bản sao cho bạn. Điều đó có nghĩa là bạn sẽ không thể đơn giản thêm hoặc tăng thêm hàm tạo bản sao mặc định vì nó sẽ không tồn tại. Đó là tất cả hoặc không có gì, vì vậy để nói chuyện.

+0

Lưu ý rằng đây cũng là một lý do khác để tránh làm việc (ví dụ: con trỏ trần) yêu cầu viết một hàm tạo bản sao. Không, trừ khi bạn không có lựa chọn nào khác. –

5

không thể. Tuy nhiên, nếu bạn muốn giảm bớt mã dư thừa cho một số lượng lớn "mặc định sao chép" các lĩnh vực, nó có thể đạt được với thừa kế 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

Những gì bạn muốn làm là không nartually hỗ trợ bởi C++: bạn không thể có một nửa hàm khởi tạo mặc định.

Nhưng những gì bạn muốn đạt được có thể được thực hiện bởi các mẹo nhỏ dưới đây:

xin lưu ý bản demo nhỏ dưới đây có một khiếm khuyết rất nhiều (bộ nhớ bị rò rỉ vv), do đó, nó chỉ cho demostration giải pháp dự kiến ​​chỉ:

//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

Tôi nghĩ rằng điều này đã được đề cập bởi người dùng396672 –

+0

Tôi không biết là tôi chỉ đọc câu hỏi của bạn và worte giải pháp này bản thân mình ... – Gob00st

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