tôi muốn sử dụng chuỗi bên trong Liên minh. nếu tôi viết như sauTại sao trình biên dịch không cho phép std :: string bên trong union?
union U
{
int i;
float f;
string s;
};
Trình biên dịch cho biết lỗi U :: S có hàm tạo bản sao.
Tôi đọc một số bài đăng khác để biết cách khác để giải quyết vấn đề này. Nhưng tôi muốn biết tại sao trình biên dịch không cho phép điều này ngay từ đầu?
EDIT: @KennyTM: Trong bất kỳ công đoàn nào, nếu thành viên được khởi tạo, những người khác sẽ có giá trị rác, nếu không có giá trị khởi tạo nào sẽ có giá trị rác. Tôi nghĩ rằng, công đoàn được gắn thẻ chỉ cung cấp một số tiện nghi để truy cập các giá trị hợp lệ từ Union. Câu hỏi của bạn: làm cách nào để bạn hoặc trình biên dịch viết một hàm tạo bản sao cho công đoàn ở trên mà không có thêm thông tin? sizeof (chuỗi) cho 4 byte. Dựa trên điều này, trình biên dịch có thể so sánh các kích thước thành viên khác và phân bổ phân bổ lớn nhất (4byte trong ví dụ của chúng tôi). Chiều dài chuỗi nội bộ không quan trọng vì nó sẽ được lưu trữ ở một vị trí riêng biệt. Để chuỗi có độ dài bất kỳ. Tất cả những gì mà Union phải biết là gọi hàm tạo bản sao lớp chuỗi với tham số chuỗi. Trong bất kỳ cách nào trình biên dịch tìm thấy rằng hàm tạo bản sao phải được gọi trong trường hợp bình thường, phương thức tương tự như được theo sau ngay cả khi chuỗi nằm trong Liên minh. Vì vậy, tôi nghĩ rằng trình biên dịch có thể làm như thế, phân bổ 4 byte. Sau đó, nếu bất kỳ chuỗi nào được gán cho s, thì lớp chuỗi sẽ xử lý việc phân bổ và sao chép chuỗi đó bằng cách sử dụng trình phân bổ của chính nó. Vì vậy, không có cơ hội tham nhũng bộ nhớ là tốt.
Chuỗi không tồn tại tại thời điểm phát triển Union trong trình biên dịch? Vì vậy, câu trả lời vẫn chưa rõ ràng với tôi. Là một joinee mới trong trang web này, nếu có gì sai, xin lỗi tôi.
Không sử dụng 'union' khi bạn mới dùng C++,' union' là fiddle với bộ nhớ và đó là tên miền dành riêng cho các chuyên gia.Bạn cần phải tìm hiểu về C++ hướng đối tượng để hiểu tại sao điều này xảy ra và bạn thiếu quá nhiều khái niệm vào lúc này để hiểu bất kỳ câu trả lời nào (chúng có vẻ khó hiểu với bạn). Có sẵn các tài nguyên tuyệt vời và một số chủ đề trên trang này liệt kê chúng. –
am mới cho trang web này, không phải C++. Dù sao .. Cảm ơn tất cả vì những nỗ lực và đầu vào của bạn. – bjskishore123