2009-12-20 56 views
8

Khi viết một hàm tạo bản sao cho một lớp chứa con trỏ đến bộ nhớ được cấp phát động, tôi có một câu hỏi.Viết bản sao sâu - sao chép giá trị con trỏ

Làm cách nào tôi có thể chỉ định rằng tôi muốn giá trị của con trỏ của đối tượng được sao chép từ đối tượng được sao chép sang con trỏ của đối tượng được sao chép sang đối tượng. Rõ ràng một cái gì đó như thế này không hoạt động ...

*foo = *bar.foo; 

vì, đối tượng thanh đã được xóa (mục đích sao chép các đối tượng ở nơi đầu tiên), và điều này chỉ có các sao chép vào điểm foo đối tượng để cùng một nơi.

Giải pháp ở đây là gì? Làm cách nào để lấy giá trị của bộ nhớ được cấp phát động và sao chép nó vào một địa chỉ khác?

+0

Câu hỏi làm cho không có ý nghĩa. Hãy thử và cải cách nó, có thể đăng thêm mã để minh họa những gì bạn đang hỏi. –

+0

Cần thêm thông tin: Loại foo sẽ tốt. Bất kỳ thành viên nào khác. Một lời giải thích lý do tại sao bạn không sử dụng một con trỏ thông minh? –

+0

Giao dịch này với mảng nhưng có thể hữu ích: http://stackoverflow.com/questions/255612/c-dynamically-allocating-an-array-of-objects/255744#255744 –

Trả lời

18

Bạn phân bổ đối tượng mới

class Foo 
{ 
    Foo(const Foo& other) 
    { 
     // deep copy 
     p = new int(*other.p); 

     // shallow copy (they both point to same object) 
     p = other.p; 
    } 

    private: 
     int* p; 
}; 
1

Tôi không thấy ngữ cảnh, nhưng mã bạn đăng dường như không sao chép con trỏ, đó chính xác là những gì bạn yêu cầu - sao chép mọi thứ nó trỏ đến. Miễn là foo trỏ đến đối tượng được cấp phát.

2

tôi giả sử lớp học của bạn trông như thế này.

class Bar { 
    Foo* foo; 
    ... 
} 

Để làm được một bản sao sâu, bạn cần phải tạo một bản sao của đối tượng được tham chiếu bởi 'bar.foo'. Trong C++ bạn làm điều này chỉ bằng cách sử dụng toán tử new để gọi copy constructor lớp Foo của:

Bar(const Bar & bar) 
{ 
    this.foo = new Foo(*(bar.foo)); 
} 

Lưu ý: giải pháp này đại biểu quyết định về việc liệu các nhà xây dựng bản sao mới Foo (constFoo &) cũng thực hiện một 'sâu sao chép 'để thực hiện các lớp Foo ... cho sự đơn giản, chúng tôi giả định nó' điều đúng '!

[Lưu ý ... câu hỏi được viết là rất khó hiểu - nó yêu cầu 'giá trị con trỏ của đối tượng được sao chép' không giống như bản sao sâu đối với tôi: nghe giống như bản sao nông , tức là cái này.

Bar(const Bar & bar) 
{ 
    this.foo = bar.foo; 
} 

Tôi giả định này chỉ là sự nhầm lẫn vô tội trên một phần của Asker, và một bản sao sâu là những gì đang bị truy nã.]

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