2012-01-17 42 views
5

Làm cách nào để bạn khởi tạo các giá trị của cấu trúc sau trong một hàm tạo để xác định các giá trị?Cách khởi tạo một trường bit trong một hàm tạo

Cả hai tùy chọn thể hiện trong ví dụ mã của tôi dường như có một chút xấu xí ....

struct T_AnlagenInfo01 
{ 
    // Option A 
    T_AnlagenInfo01() : fReserve80_0(0), fReserve80_1(0),.... {}; 

    // Option B 
    T_AnlagenInfo01() 
    { 
     memset(this, 0, sizeof(T_AnlagenInfo01)); 
    } 

    unsigned long fReserve80_0       : 1;   
    unsigned long fReserve80_1       : 1;   
    unsigned long fReserve80_2       : 1;   
    unsigned long fReserve80_3       : 1;   
    unsigned long fReserve80_4       : 1; 
    unsigned long fReserve80_5       : 1; 
    unsigned long fReserve80_6       : 1; 
    unsigned long fReserve80_7       : 1; 

    unsigned long fReserve81_0       : 1;  // 81 
    unsigned long fReserve81_1       : 1;   
    unsigned long fReserve81_2       : 1;   
    unsigned long fReserve81_3       : 1; 
    unsigned long fReserve81_4       : 1; 
    unsigned long fReserve81_5       : 1; 
    unsigned long fReserve81_6       : 1; 
    unsigned long fReserve81_7       : 1; 
}; 
+0

Hãy cẩn thận với tùy chọn 'memset' nếu bạn có các hàm ảo trong lớp, vì nó sẽ ghi đè lên vtable. –

+0

Quy ước đặt tên khủng khiếp. Di sản, tôi đoán vậy? Dù sao, 'fReserve80_0 (0)' là cách tiêu chuẩn, và thực sự ít xấu xí và dễ bảo trì hơn và an toàn hơn so với memset. –

+0

@phresnel: Ooooh yes ... :-(Mã cũ đã ngừng hoạt động khi được sử dụng trên một máy mới nhanh hơn –

Trả lời

3

Một giải pháp hiển nhiên sẽ là đưa tất cả các bit trong một cấu trúc riêng biệt, mà là một thành viên của cấu trúc của bạn, và sao chép khởi rằng từ một thành viên tĩnh, ví dụ:

struct T_AnlagenInfo01 
{ 
    struct Bits 
    { 
     unsigned long fReserve80_0 : 1; 
     unsigned long fReserve80_1 : 1; 
     // ... 
    }; 
    Bits myBits; 
    static Bits initialBits; 

    T_AnlagenInfo01 : myBits(initialBits) {} 
}; 

T_AnlagenInfo01::Bits T_AnlagenInfo01::initialBits = {}; 

sẽ này thậm chí cho phép các bit nhất định có giá trị khác với 0.

2

Tôi nghĩ Option A không phải là xấu. Nếu bạn đồng ý với sự cố về việc có các biến được đặt tên khác nhau cho từng bit, thì bạn cũng nên loại bỏ chúng một cách riêng biệt. Option B có vẻ giống như một hack bẩn và thậm chí có thể được kỹ thuật hành vi không xác định (tôi không hoàn toàn chắc chắn mặc dù). Trong mọi trường hợp, an toàn hơn là xin lỗi. Hãy nghĩ về nó, có một cơ hội béo mà nó thực sự UB vì loại của bạn không phải là POD.

Xin lưu ý rằng câu trả lời của tôi được giữ nếu bạn muốn có các biến có tên khác nhau cho từng bit. Bạn luôn có thể có std::vector<bool> hoặc std::bitset<N> hoặc boost::dynamic_bitset làm thành viên thay vì tất cả các trường bit này.

0

Lựa chọn C

struct T_AnlagenInfo01 
{ 
    bitset<14> mybits; 
} 

Bạn có thể sử dụng bitset thay vì lĩnh vực bit và bạn không cần phải làm bất cứ điều gì đặc biệt để khởi tạo nếu bạn muốn tất cả chúng unset. Và thay vì một lớp học với 14 thành viên, bạn có thể cung cấp các chức năng thành viên để thực hiện cùng một công việc.

+0

Xin lỗi, tôi phải giữ cấu trúc dữ liệu. Vì vậy, không có bitet cho tôi .... –

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