@AndreyT đưa ra một câu trả lời tuyệt vời mà tôi sẽ mở rộng với một lời khuyên thực tế nhỏ.
Tôi có xu hướng sử dụng công đoàn để dễ dàng truy cập vào giá trị bitmap mà không có bitwise tẻ nhạt và xấu xí và/bitwise hoặc của. Tôi nghĩ đây là một thực tế khá phổ biến.
Một kỹ thuật tôi đã sử dụng trong một thời gian để làm cho quá trình dễ dàng hơn là nếu tôi đang làm việc với một bitmap dưới 32bits Tôi tuyên bố nó như là một vô danh struct bên trong một đoàn cùng với người bạn đồng hành DWORD thành viên dữ liệu. Ví dụ:
union UNICODECONTROL{
DWORD dwAccessor;
struct{
unsigned unicode_01 : 1;
unsigned unicode_02 : 1;
unsigned unicode_03 : 1;
unsigned unicode_04 : 1;
unsigned unicode_05 : 1;
unsigned unicode_06 : 1;
unsigned unicode_07 : 1;
unsigned unicode_08 : 1;
unsigned unicode_09 : 1;
unsigned unicode_10 : 1;
};
};
Với điều đó tại chỗ nó sẽ hoạt động giống như chức năng 'người truy cập'. Nếu bạn muốn thiết lập các giá trị bạn có thể làm như vậy trong một lần bằng cách gán một số với bitmap thích hợp cho 'accessor' này. Bạn muốn không phải tất cả chúng - cũng là một miếng bánh. Nó đặc biệt làm việc rất tốt với các cửa sổ đăng ký. Để lưu trữ giá trị của bitmap công đoàn, tất cả những gì bạn cần làm chỉ là viết DWORD vào sổ đăng ký! Truy xuất nó sau này để tái khởi tạo cũng không kém phần đơn giản.
A DWORD là một trong các kiểu gốc của sổ đăng ký và bạn không cần phải gây rối xung quanh chức năng chuyển đổi tĩnh hoặc viết thủ công. Nếu bạn có bitmap dài hơn 32 bit, bạn có thể khai báo một số nguyên có kích thước 64Bit và nó sẽ hoạt động theo cách tương tự thường - và cũng như với sổ đăng ký là QUADWORD cũng là một kiểu gốc.
Trường hợp này mang trực tiếp vào những gì @AndreyT đề cập - nếu bạn muốn khởi tạo thuận tiện của một thành viên dữ liệu lớp ở định dạng bitmap/DWORD của tôi, tất cả những gì bạn phải làm là - như trong ví dụ - hãy đảm bảo 'accessor' là giá trị đầu tiên được khai báo trong liên minh. Sau đó, bạn có thể ghi danh sách trực tiếp với lược đồ C++ 11 '{}' mới. Không cần cho các nhà xây dựng công đoàn kỳ lạ chút nào!
Báo trước. Trường hợp các bit bitmap riêng biệt sống 'bên trong' thì trình truy cập DWORD sẽ phụ thuộc vào thiết lập căn chỉnh cho các cấu trúc của bạn. Điều này được đặt ở cấp trình biên dịch hoặc với câu lệnh __declspec(align(#))
trong MSVC++ và cú pháp tương tự trong các trình biên dịch khác.
Cuối cùng, cập nhật đã tìm hiểu trong khi thử các ý tưởng này trong một số trường hợp khác nhau gần đây. Mặc dù thực tế C++ 11 nói rõ ràng là hợp pháp để khởi tạo một công đoàn bằng biến đầu tiên của nó như được mô tả ở trên, MSVC++ dường như bỏ qua tiêu chuẩn này - hoặc 'không thực hiện'. Vì vậy nếu bạn đang sử dụng trình biên dịch Microsoft, bạn sẽ phải thực hiện một hàm tạo lộn xộn cho công đoàn của bạn nếu bạn muốn khởi tạo nó. Một sự xấu hổ, nhưng có lẽ việc tuân thủ tiêu chuẩn C++ 11 sẽ cải thiện trong các gói dịch vụ tiếp theo cho VS2013 và với lần lặp tiếp theo năm 2014 của toàn bộ IDE.
Nguồn
2014-11-07 19:35:42
http://stackoverflow.com/questions/321351/initializing-a-union-with-a-non-trivial-constructor – Mysticial