2009-02-17 30 views
5

Tôi có một C++ lớp, giả sử nó được gọi là c, và tôi muốn sử dụng constructor sao chép ngầm tại một trong những phương pháp, như thế này:Sử dụng "này" như một tham số để sao chép constructor

c c::do_something() { 
    c copy = this; //I want implicit copy constructor here! 
    copy.something_else(); 
    //........// 
    return copy; 
} 

Tuy nhiên, lợi nhuận gcc lỗi này:

error: invalid conversion from 'c* const' to 'long unsigned int'

(tôi có một nhà xây dựng từ lâu unsigned int hiện tại)

... như thể các nhà xây dựng bản sao đã không tồn tại. Tôi đang làm gì sai?

Trả lời

20

đây là một con trỏ đến một đối tượng vì vậy nó phải

c copy = *this; 
+0

ok ... vâng, đúng vậy. thanks :) –

+0

Điều này thực sự là sử dụng hàm tạo mặc định và sau đó toán tử gán, * không * hàm tạo bản sao. Xem phản ứng của Matt. –

+0

Andrew: Tôi không chắc chắn - Josh bên dưới (và một số trang web) nói rằng đối diện –

4

Whoa whoa! Ngoài ra, đừng nhầm lẫn giữa hàm tạo bản sao và toán tử gán bản sao.

c copy (*this); 

là người tạo bản sao;

c copy = *this; 

là toán tử gán bản sao. Hoặc là sẽ làm việc, mặc dù các nhà xây dựng bản sao là kỹ thuật hiệu quả hơn, mặc dù các nhà điều hành gán bản sao thường được tối ưu hóa để làm điều tương tự.


Chà - Tôi thấy mình đã sửa. Sử dụng toán tử = trong cùng câu lệnh khi khai báo một biến thực sự gọi hàm tạo bản sao. Bạn học được điều gì mới mỗi ngày!

+0

No - c copy (* this); giống hệt với c copy = * this; (miễn là * đây là kiểu c) cả hai đều gọi hàm tạo bản sao. c bản sao; copy = * điều này; gọi hàm khởi tạo mặc định và sau đó là toán tử gán. – Eclipse

+0

Nó không chỉ là vấn đề hiệu quả ... các nhà xây dựng bản sao và nhà điều hành chuyển nhượng có thể là các chức năng hoàn toàn khác nhau. –

6

Khá sang một bên, nhưng nó sẽ không thực sự phù hợp trong một bình luận và có vẻ như có một số bất đồng. Hãy thử đoạn mã này để biết ý tưởng khi các nhà xây dựng bản sao và nhà khai thác gán được gọi là:

class A 
{ 
public: 
    A() { cout << "A::A()\n"; } 
    A(const A &) { cout << "A::A(const A &)\n"; } 
    void operator =(const A &) { cout << "A::operator=(const A &)\n"; } 
}; 

int main() 
{ 
    A a; // default constructor 
    A copy = a; // copy constructor (and no assignment operator) 
    A copy2(a); // copy constructor (and no assignment operator) 
    a = copy; // assignment operator 
    A function(); // declares a function return A 
    A b = A(); // default constructor (but no assignment operator) 
    A b2 = A(a); // copy constructor (but no assignment operator) 
} 
+0

Để hoàn thành, có thể là một ý tưởng để thêm một hàm tạo "A (int)" và sau đó hiển thị "A a = 10;" tương đương với: "A a (A (10))". –

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