Gần đây tôi đã phát hiện ra rằng khi tôi có con trỏ trong một lớp, tôi cần phải chỉ định một hàm tạo Sao chép.Copy constructor với con trỏ
Để tìm hiểu điều đó, tôi đã thực hiện mã đơn giản sau đây. Nó biên dịch, nhưng cung cấp cho tôi lỗi thời gian chạy khi thực hiện hàm tạo bản sao.
Tôi đang cố gắng sao chép chỉ giá trị từ con trỏ của đối tượng đã sao chép, nhưng tránh chỉ định cùng một địa chỉ.
Vì vậy, có gì sai ở đây?
class TRY{
public:
TRY();
~TRY();
TRY(TRY const &);
int *pointer;
void setPointer(int);
};
void TRY::setPointer(int a){
*pointer = a;
return;
}
TRY::TRY(){}
TRY::~TRY(){}
TRY::TRY(TRY const & copyTRY){
int a = *copyTRY.pointer;
*pointer = a;
}
int main(){
TRY a;
a.setPointer(5);
TRY b = a;
b.setPointer(8);
cout << "Address of object a = " << &a << endl;
cout << "Address of object b = " << &b << endl;
cout << "Address of a.pointer = " << a.pointer << endl;
cout << "Address of b.pointer = " << b.pointer << endl;
cout << "Value in a.pointer = " << *a.pointer << endl;
cout << "Value in b.pointer = " << *b.pointer << endl;
return 0;
}
Tôi sẽ sử dụng khái niệm này cho các lớp khác có nhiều con trỏ trong đó, nơi tôi cần sao chép tất cả các giá trị từ đối tượng này sang đối tượng kia. Việc sao chép ban đầu là cần thiết cho mã này, vì vậy tôi muốn giữ khả năng sao chép (tôi sẽ không ẩn phần khởi tạo sao chép dưới dạng riêng tư).
Bên cạnh đó, lớp thực sự tôi cần triển khai có 10 con trỏ và có thể thay đổi theo thời gian. không có cách nào thông minh hơn để có một constructor sao chép sâu trong C++? ...
Đừng quên xóa m_p trước khi phân bổ một đối tượng mới cho nó. – xtofl
Tôi chưa xác định toán tử gán, nó chỉ là một hàm tạo bản sao. Do đó không cần xóa m_p. – Naveen
Trong một hàm tạo, m_p ban đầu sẽ không được xác định trừ khi bạn đặt nó vào danh sách khởi tạo một cách rõ ràng. Nếu bạn cố gắng xóa một con trỏ không xác định, những điều xấu sẽ xảy ra. –